2015-02-09 111 views
1

我有被佈置這樣的數據集:條件和/或嵌套ifelse發生變異邏輯與dplyr

ID A B C D Win Loss 
001 NA 3 NA NA 6 NA 
002 NA NA NA NA NA 17 
003 1 5 12 18 NA 22 
004 NA 7 9 NA 31 NA 
005 8 2 NA NA NA 14 
006 2 6 12 19 25 NA 
007 NA NA NA NA 6 NA 

在該數據集,ID被假定通過每個階段(A,B,C,d移動)按時間順序排列,並在結尾處輸入贏/輸(ID 003和006)

然而,有時ID會向後移動(ID 005),其他跳過階段(ID 001和004),有些則直接輸入贏/輸(ID 002和007)。

我想用dplyr變異邏輯調出這些。輸出:

ID A B C D Win Loss Backwards Skip Just W/L 
001 NA 3 NA NA 6 NA F   T  F 
002 NA NA NA NA NA 17 F   T  T 
003 1 5 12 18 NA 22 F   F  F 
004 NA 7 9 NA 31 NA F   T  F 
005 8 2 NA NA NA 14 T   T  F 
006 2 6 12 19 25 NA F   F  F 
007 NA NA NA NA 6 NA F   T  T 

我知道,我應該使用類似this邏輯,但我我無法弄清楚。

在此先感謝。

編輯:如果

獎勵積分也可以告訴我怎麼算,即使它跳過一對夫婦各階段之間的時間/天。

回答

3

這可以使用base R完成。選擇感興趣的列df[LETTERS[1:4]],創建存在/不存在「NAs」(is.na(df[...))的邏輯矩陣。否定它(!),以便非NA元素變爲「TRUE」,獲得行明智總和rowSums並取消它!,因此具有0非NA值的行將變爲TRUE,並且僅僅是贏或失利。對於「向後」,我們可以使用循環方法(apply()作爲行(MARGIN=1),檢查非NA元素(diff(na.omit(x)))的差值是否有負數(any(....)<0)。如果有,則表示ID向後移動。 「Skip」也類似於「JustWL」,其中我們得到邏輯矩陣(is.na(..)),逐行(rowSums)和雙重否定(!!)。如果至少有一個「NA」,這將是TRUE。

JustWL <- !rowSums(!is.na(df[LETTERS[1:4]])) 
Backwards <- apply(df[LETTERS[1:4]], 1, function(x) any(diff(na.omit(x))<0)) 
Skip <- !!rowSums(is.na(df[LETTERS[1:4]])) 

df1 <- data.frame(df, JustWL, Backwards, Skip) 
df1 
# ID A B C D Win Loss JustWL Backwards Skip 
# 1 1 NA 3 NA NA 6 NA FALSE  FALSE TRUE 
# 2 2 NA NA NA NA NA 17 TRUE  FALSE TRUE 
# 3 3 1 5 12 18 NA 22 FALSE  FALSE FALSE 
# 4 4 NA 7 9 NA 31 NA FALSE  FALSE TRUE 
# 5 5 8 2 NA NA NA 14 FALSE  TRUE TRUE 
# 6 6 2 6 12 19 25 NA FALSE  FALSE FALSE 
# 7 7 NA NA NA NA 6 NA TRUE  FALSE TRUE 

或者使用dplyr

library(dplyr) 
df %>% 
    mutate(JustWL=!rowSums(!is.na(.[LETTERS[1:4]])), 
      Skip=!!rowSums(is.na(.[LETTERS[1:4]]))) %>% 
      rowwise() %>% 
      do(data.frame(., Backwards= 
       any(diff(na.omit(unlist(.[LETTERS[1:4]])))<0))) 
+0

相同的代碼,你可以解釋如何向後任何(DIFF()函數和跳過!!命令的作品? – emehex 2015-02-09 19:58:27

+0

@ user3731467我將在後更新。 – akrun 2015-02-09 19:59:07