我有一个像这样排列的数据集:
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类似的逻辑,但我无法弄明白。
提前致谢。
编辑:
如果您还可以告诉我如何计算每个阶段之间经过的时间/天数,即使它跳过一对,也可以获得奖励积分。
答案 0 :(得分:3)
可以使用base R
完成此操作。选择感兴趣的列df[LETTERS[1:4]]
,创建一个存在/不存在" NAs"的逻辑矩阵。 (is.na(df[...)
)。否定它(!
)以便非NA元素变为" TRUE",得到行方式总和rowSums
并将其否定!
所以行{{1}非NA值将变为TRUE,这就是胜负的情况。对于"向后",我们可以对行(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