带有dplyr的条件和/或嵌套ifelse mutate逻辑

时间:2015-02-09 19:26:53

标签: r 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跳过阶段(ID 001和004),有些则直接进入Win / Loss(ID 002和007)。

我想用dplyr mutate逻辑调用它们。输出:

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类似的逻辑,但我无法弄明白。

提前致谢。

编辑:

如果您还可以告诉我如何计算每个阶段之间经过的时间/天数,即使它跳过一对,也可以获得奖励积分。

1 个答案:

答案 0 :(得分:3)

可以使用base R完成此操作。选择感兴趣的列df[LETTERS[1:4]],创建一个存在/不存在&#34; NAs&#34;的逻辑矩阵。 (is.na(df[...))。否定它(!)以便非NA元素变为&#34; TRUE&#34;,得到行方式总和rowSums并将其否定!所以行{{1}非NA值将变为TRUE,这就是胜负的情况。对于&#34;向后&#34;,我们可以对行(0)使用循环方法(apply(),检查非NA元素的差异(MARGIN=1)有任何负数(diff(na.omit(x)))。如果有,则表示ID向后移动。 &#34; Skip&#34;也类似于&#34; JustWL&#34;我们得到逻辑矩阵(any(....)<0),按行加总(is.na(..))和双加法(rowSums)。如果至少有一个&#34; NA&#34;,则为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