2015-02-09 85 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