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

时间:2014-03-21 03:00:15

标签: r if-statement sapply

我正在研究循环遍历数据框中每一列的通用代码,如果该列中唯一值的数量小于32,则将该列转换为“因子”类。 我目前的进展是:

dfr <- data.frame(x<-floor(runif(40,0,5)), y<-rnorm(40))

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

在这个例子中,我想将变量'y'转换为因子变量。 所以我这样做:

sapply(dfr, function(x) ifelse(length(unique(x)) <= 32, x <- as.factor(x), x))

但是,在执行此操作后,我无法将类转换为'y'

sapply(dfr, class)

 y        z 

"numeric" "numeric"

任何人都可以指导我哪里出错了。我没想到做这个动作是为了这个繁重。

提前致谢。

1 个答案:

答案 0 :(得分:4)

  1. ifelse将返回与测试长度相同的向量(不是您想要的),使用if(){}else{}代替

  2. y中有超过40个唯一值,因此您的函数不会将其强制为因子。

  3. sapply会将结果强制转换为矩阵,这会强制所有变量都是相同的“类”

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

    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 ...