我有这个数据框:
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))
有什么建议吗?
答案 0 :(得分:1)
即使id
是NA
,也要计算所有值的累积总和,然后如果cs
是NA
,则将最终的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 ,在计算累积总和时排除id
为NA
的行
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
,因此,如果id
为NA
,它将不会提供累加的总和,而是得到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