2015-06-10 58 views
4

我想在我的數據集中創建一個新的列,爲每行和每行提供一個輸出,具體取決於來自預先存在的列的輸入。使用ifelse內適用

在這個輸出列中,我希望「NA」如果給定行中的任何輸入值都是「0」。 否則(如果沒有輸入是0),我希望該行的輸出是輸入的唯一值的數量。

我認爲解決方案將使用嵌套在內的ifelse功能適用功能,但我得到我不明白的錯誤。

data$output <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))}) 

錯誤$<-.data.frame*tmp*, 「輸出」,值= C(3L,3L,3L,3L,: 更換有3排,數據具有4

我不知道爲什麼更換了3行,因爲我想申請只是做同樣的功能,我的每一個4行。

回答

8

你想,以檢查是否有連續的變量都是0,所以你需要在ifelse語句中使用any(x==0)而不是x == 0

apply(data, 1, function(x) {ifelse(any(x == 0), NA, length(unique(x)))}) 
# [1] 1 NA 2 

基本上ifelse返回長度爲n如果一個向量其第一個參數是長度爲n的。您希望每行有一個值,但要傳遞多個值x==0(您傳遞的值的數量等於數據框中的列數)。

數據:

(data <- data.frame(a=c(1, 2, 3), b=c(1, 0, 1))) 
# a b 
# 1 1 1 
# 2 2 0 
# 3 3 1 
0

n = length(x)ifelse將返回rep(NA, n)如果TRUE otherw ise rep(length(unique(x)), n)。因此apply將輸出一個矩陣。 data$output <- apply(...嘗試將矩陣(您的結果)分配到您的data.framedata$output的列中。這是你錯誤的原因。

你的代碼運行,如果你只是你的輸出分配給一個變量,而不是

out <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})

如果你不能指望class(matrix)作爲輸出,而是一個向量,那麼有什麼不對的你的功能的邏輯。