2014-04-25 74 views
0

我有一個主要是數字列的數據框,每個列都有幾個獨特的元素。那些具有20個或更少的獨特價值的人,我想轉換爲因素,更多的,我想使用gtools::quantcut轉換爲因素。使用if(。){} else {} lapply

什麼是我不瞭解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

看起來很清楚,你不應該使用'ifelse'這是一個不同的R函數,並要求所有涉及的向量是相同的長度'獨特'相當有效地擰緊。 –

回答

1

問題是,當測試參數是標量時,您要求ifelse返回一個向量。上面的wrong方法中的ifelse語句返回所需向量的第一個元素。在幫助文件中:ifelse只能返回「與test形狀相同的值」。

+0

Gah。我以爲我很瞭解'ifelse',所以我甚至沒有去幫助文件。感謝您獲得這麼快。 –