我正在尝试计算一个以其他变量为条件的运行计数(即累积总和),并且可以为另一个变量的特定值重置。我在 R 中工作,如果可能的话,我更喜欢基于 dplyr
的解决方案。
我想基于以下算法为运行计数创建一个变量 cumulative
:
cumulative
和 id
age
)cumulative
将运行计数 ( trial
) 递增 1,其中 accuracy = 0
、 block = 2
和 condition = 1
cumulative
的运行计数 ( trial
) 重置为 0,其中 accuracy = 1
、 block = 2
和 condition = 1
,并且下一个增量从 1(不是前一个数字)恢复 trial
,其中 block != 2
或 condition != 1
,将运行计数( cumulative
)保留为 NA
这是一个最小的工作示例:
mydata <- data.frame(id = c(1,1,1,1,1,1,1,1,1,1,1),
age = c(1,1,1,1,1,1,1,1,1,1,2),
block = c(1,1,2,2,2,2,2,2,2,2,2),
trial = c(1,2,1,2,3,4,5,6,7,8,1),
condition = c(1,1,1,1,1,2,1,1,1,1,1),
accuracy = c(0,0,0,0,0,0,0,1,0,0,0)
)
id age block trial condition accuracy
1 1 1 1 1 0
1 1 1 2 1 0
1 1 2 1 1 0
1 1 2 2 1 0
1 1 2 3 1 0
1 1 2 4 2 0
1 1 2 5 1 0
1 1 2 6 1 1
1 1 2 7 1 0
1 1 2 8 1 0
1 2 2 1 1 0
预期的输出是:
id age block trial condition accuracy cumulative
1 1 1 1 1 0 NA
1 1 1 2 1 0 NA
1 1 2 1 1 0 1
1 1 2 2 1 0 2
1 1 2 3 1 0 3
1 1 2 4 2 0 NA
1 1 2 5 1 0 4
1 1 2 6 1 1 0
1 1 2 7 1 0 1
1 1 2 8 1 0 2
1 2 2 1 1 0 1
最佳答案
我们可以使用 case_when
根据我们的条件分配我们需要的值。然后我们添加一个额外的 group_by
条件,当 cumsum
列为 0 时,使用 temp
来切换值。在最后的 mutate
步骤中,我们暂时将 replace
中的 NA
temp
值设为 0,然后将 cumsum
覆盖并放回 NA
值以再次到位最终输出。
library(dplyr)
mydata %>%
group_by(id, age) %>%
mutate(temp = case_when(accuracy == 0 & block == 2 & condition == 1 ~ 1,
accuracy == 1 & block == 2 & condition == 1 ~ 0,
TRUE ~ NA_real_)) %>%
ungroup() %>%
group_by(id, age, group = cumsum(replace(temp == 0, is.na(temp), 0))) %>%
mutate(cumulative = replace(cumsum(replace(temp, is.na(temp), 0)),
is.na(temp), NA)) %>%
select(-temp, -group)
# group id age block trial condition accuracy cumulative
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 0 1 1 1 1 1 0 NA
# 2 0 1 1 1 2 1 0 NA
# 3 0 1 1 2 1 1 0 1
# 4 0 1 1 2 2 1 0 2
# 5 0 1 1 2 3 1 0 3
# 6 0 1 1 2 4 2 0 NA
# 7 0 1 1 2 5 1 0 4
# 8 1 1 1 2 6 1 1 0
# 9 1 1 1 2 7 1 0 1
#10 1 1 1 2 8 1 0 2
#11 1 1 2 2 1 1 0 1
关于r - 在 R (dplyr) 中重置的条件运行计数(累计和),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52960348/