所以我有一个ID是一个事件,我想使用group_by(或一些类似的函数)来做一个条件累积和。这是数据:
ID Event
42 NA
42 1
42 2
42 NA
42 1
43 NA
43 1
43 2
43 2
我想要做的是有两个新的列,累计计算1和2,而不会折叠任何数据:
ID Event count_1s count_2s
42 NA 0 0
42 1 1 0
42 2 1 1
42 NA 1 1
42 1 2 1
43 NA 0 0
43 1 1 0
43 2 1 1
43 2 1 2
所以我理解如何使用group_by将它们总结为ID,如下所示:
t <- data %>% group_by(ID, Event) %>% summarize(count_1s = sum(!is.na(Event == 1)))
但我无法理解的是如何获得一个运行的条件总和 - 似乎group_by会折叠我的数据,我需要维护每一行。
编辑:所以接受的答案完美无缺,但还有一个问题。如果价值因事件不同怎么办?例如:
ID Event count_a count_b
42 NA 0 0
42 1 1 0
42 2 1 1
42 NA 1 1
42 1 2 1
43 NA 0 0
43 3 1 0
43 4 1 1
43 4 1 2
每个ID总是只有两个事件值,(并不重要,哪个是a,哪个是b),我希望每次都重置它们。
答案 0 :(得分:6)
按“ID”列进行分组后,我们可以通过比较“事件”中等于1但不是NA
的元素,然后cumsum
逻辑来创建'count_1s'指数。以类似的方式,我们可以创建'count_2s'。
library(dplyr)
data %>%
group_by(ID) %>%
mutate(count_1s= cumsum(Event==1 & !is.na(Event)),
count_2s= cumsum(Event==2 & !is.na(Event)))
# ID Event count_1s count_2s
# (int) (int) (int) (int)
#1 42 NA 0 0
#2 42 1 1 0
#3 42 2 1 1
#4 42 NA 1 1
#5 42 1 2 1
#6 43 NA 0 0
#7 43 1 1 0
#8 43 2 1 1
#9 43 2 1 2
使用OP的更新数据集,在我们按“ID”分组后,我们可以通过将“事件”转换为factor
类,然后将其强制转换回{{1}来创建新列“Event1” } class(或其他选项numeric
使用'{1}}元素'事件'进行'事件'),然后像以前一样创建'count_a'和'count_b'。
match
unique