R中有group_by的条件累积求和?

时间:2015-09-08 13:11:34

标签: r conditional cumulative-sum

所以我有一个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),我希望每次都重置它们。

1 个答案:

答案 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