我正在研究循环遍历数据框中每一列的通用代码,如果该列中唯一值的数量小于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"
任何人都可以指导我哪里出错了。我没想到做这个动作是为了这个繁重。
提前致谢。
答案 0 :(得分:4)
ifelse
将返回与测试长度相同的向量(不是您想要的),使用if(){}else{}
代替
y
中有超过40个唯一值,因此您的函数不会将其强制为因子。
sapply会将结果强制转换为矩阵,这会强制所有变量都是相同的“类”
您要做的是使用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 ...