首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sapply迭代地更改R中变量的类

使用sapply迭代地更改R中变量的类
EN

Stack Overflow用户
提问于 2014-03-21 03:00:15
回答 1查看 766关注 0票数 1

我正在编写一个泛型代码,它循环遍历数据帧中的每一列,如果列中的唯一值的数量少于32,则将该列转换为"factor“类。我目前的进展是:

代码语言:javascript
复制
dfr <- data.frame(x<-floor(runif(40,0,5)), y<-rnorm(40))

colnames(dfr)<-c('y','z')

在这个例子中,我希望变量'y‘被转换成一个因子变量。所以我想:

代码语言:javascript
复制
sapply(dfr, function(x) ifelse(length(unique(x)) <= 32, x <- as.factor(x), x))

但是,这样做之后,我无法将类转换为“y”

代码语言:javascript
复制
sapply(dfr, class)

 y        z 

"numeric" "numeric"

有人能指点我哪里出问题了吗。我没想到做这件事会这么麻烦。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-21 03:08:16

  1. ifelse将返回与测试长度相同的向量(不是您想要的),而是使用if(){}else{}
  2. 您在y中有超过40个唯一值,所以您的函数不会强迫它考虑因素。
  3. sapply将将结果强制到一个矩阵中,这将强制所有变量都是相同的“类”。

您要做的是使用lapply,然后替换原始内容。

代码语言:javascript
复制
dfr[] <- lapply(dfr, function(x) if(length(unique(x)) <=32) { as.factor(x)} else{x})
# It works!
str(dfr)
# 'data.frame': 40 obs. of  2 variables:
#  $ y: Factor w/ 5 levels "0","1","2","3",..: 2 1 2 1 5 3 5 1 5 1 ...
#  $ z: num  0.9036 0.2909 -0.9027 -0.4588 -0.0495 ...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22549340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档