我正在编写一个泛型代码,它循环遍历数据帧中的每一列,如果列中的唯一值的数量少于32,则将该列转换为"factor“类。我目前的进展是:
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"有人能指点我哪里出问题了吗。我没想到做这件事会这么麻烦。
提前谢谢。
发布于 2014-03-21 03:08:16
ifelse将返回与测试长度相同的向量(不是您想要的),而是使用if(){}else{}y中有超过40个唯一值,所以您的函数不会强迫它考虑因素。您要做的是使用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 ...https://stackoverflow.com/questions/22549340
复制相似问题