同一ID的每一行数据的累积总和

时间:2020-03-29 15:01:50

标签: r dplyr cumsum

我有这个数据框:

df=data.frame(id=c(1,1,2,2,2,5,NA),var=c("a","a","b","b","b","e","f"),value=c(1,1,0,1,0,0,1),cs=c(2,2,3,3,3,3,NA))

我想计算每个组(id,var)的值总和,然后计算累计和,但是我想为每行数据显示累计和,即,我不想数据汇总视图。我已经包括了输出内容。到目前为止,这是我尝试过的:

df%>%arrange(id,var)%>%group_by(id,var)%>%mutate(cs=cumsum(value)) 

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

即使idNA,也要计算所有值的累积总和,然后如果csNA,则将最终的id更改为NA

df %>% 
  arrange(id, var) %>% 
  mutate(cs = cumsum(value)) %>%
  group_by(id, var) %>% 
  mutate(cs = max(ifelse(!is.na(id), cs, NA))) %>%
  ungroup() 

OR ,在计算累积总和时排除idNA的行

df %>% 
  arrange(id, var) %>% 
  mutate(cs = cumsum(ifelse(!is.na(id), value, 0))) %>%
  group_by(id, var) %>% 
  mutate(cs = max(ifelse(!is.na(id), cs, NA))) %>%
  ungroup() 

对于您的数据,两者都返回相似的结果

# A tibble: 7 x 4
#      id var   value    cs
#   <dbl> <fct> <dbl> <dbl>
# 1     1 a         1     2
# 2     1 a         1     2
# 3     2 b         0     3
# 4     2 b         1     3
# 5     2 b         0     3
# 6     5 e         0     3
# 7    NA f         1     4

答案 1 :(得分:1)

我认为这是一种符合您期望的方法。

id分组,并通过value为每个id计算summarise的总和。

然后可以使用mutate添加您的累计总和列。根据您的评论,我添加了一个ifelse,因此,如果idNA,它将不会提供累加的总和,而是得到NA

最后,要将您的累积总和数据与原始数据集结合起来,您需要将两个表合并。

library(tidyverse)

df %>%
  arrange(id) %>%
  group_by(id) %>%
  summarise(sum = sum(value)) %>%
  mutate(cs=ifelse(is.na(id), NA, cumsum(sum))) %>%
  left_join(df)

输出

# A tibble: 7 x 5
     id   sum    cs var   value
  <dbl> <dbl> <dbl> <fct> <dbl>
1     1     2     2 a         1
2     1     2     2 a         1
3     2     1     3 b         0
4     2     1     3 b         1
5     2     1     3 b         0
6     5     0     3 e         0
7    NA     1    NA f         1