在lapply中使用if(。){} else {}

时间:2014-04-25 20:11:23

标签: r lapply

我有一个主要是数字列的数据框,每个列都有很少的唯一元素。那些具有20或更少唯一值的人,我想将其转换为具有更多优势的因素,我希望使用gtools::quantcut转换为因子。

我不了解ifelselapply的行为?

d <- data.frame(a = sample(1:10, 100, replace=T), 
                                b = sample(1:10, 100 ,replace=T), 
                                c = sample(1:30, 100 ,replace=T),
                                d = sample(1:30, 100 ,replace=T),
                                e = sample(1:30, 100 ,replace=T))

wrong <- as.data.frame(lapply(d[,sapply(d, is.numeric)],
function(x) ifelse(length(unique(x)) <=20, 
                   as.factor(x),
                   quantcut(x))))
dim(wrong)
# [1]  1 5
right <- as.data.frame(lapply(d[, sapply(d, is.numeric)],
                       function(x) { 
                           if(length(unique(x)) <= 20) {
                           return(as.factor(x))
                           }
                           quantcut(x)
                           }))
dim(right)
# [1] 100    5

1 个答案:

答案 0 :(得分:1)

问题是当测试参数是标量时,你要求ifelse返回一个向量。上面wrong方式的ifelse语句返回所需向量的第一个元素。在帮助文件中:ifelse只能返回&#34;与test&#34;形状相同的值。