条件 and/or 嵌套 ifelse 使用 dplyr 变异逻辑

Conditional and/or nested ifelse mutate logic with 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)并在末尾命中 Win/Loss(ID 003 和 006)

然而,有时 ID 会向后移动 (ID 005),其他的会跳过阶段(ID 001 和 004),有些会直接进入 Win/Loss(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 的逻辑,但我就是想不通。

提前致谢。

编辑:

如果你还可以告诉我如何计算每个阶段之间经过的time/days,即使它跳过了几个阶段,也会加分。

这可以使用 base R 来完成。 Select 感兴趣的列 df[LETTERS[1:4]],创建 presence/absence 的 "NAs" (is.na(df[...)) 的逻辑矩阵。将其取反 (!) 以便非 NA 元素变为 "TRUE",获取行式总和 rowSums 并将其取反 ! 因此具有 0 的行非-NA 值将变为 TRUE,这将是赢或输的情况。对于"backwards",我们可以对行(MARGIN=1)使用循环方法(apply(),检查非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)))