![](/img/trans.png)
[英]How to get the cumulative sum of column by group when some group missing in r?
[英]How to get the cumulative sum by group in R?
假設我有一個數據幀,以便:
df<-data.frame(id=1:8,group=c(1,0,0,1,1,0,1,0),rep=c(rep("d1",4),rep("d2",4)),value=rbinom(8,1,0.6))
df
id group rep value
1 1 1 d1 0
2 2 0 d1 0
3 3 0 d1 0
4 4 1 d1 1
5 5 1 d2 1
6 6 0 d2 0
7 7 1 d2 1
8 8 0 d2 1
按group
和rep
獲得累積金額的最佳方法是:
cumsum
group d1 d1+d2 d1+d2+d3
0 0 1 ...
1 1 3 ...
我建議使用整潔的數據形式。 這是使用dplyr的方法,但轉換為data.table或base R將是微不足道的。
首先,我將創建數據集,設置隨機種子以使示例可重現:
set.seed(1014)
df <- data.frame(
id = 1:8,
group = c(1, 0, 0, 1, 1, 0, 1, 0),
rep = c(rep("d1", 4), rep("d2", 4)),
value = rbinom(8, 1, 0.6)
)
df
%> id group rep value
%> 1 1 1 d1 1
%> 2 2 0 d1 0
%> 3 3 0 d1 0
%> 4 4 1 d1 1
%> 5 5 1 d2 1
%> 6 6 0 d2 1
%> 7 7 1 d2 1
%> 8 8 0 d2 1
接下來,使用dplyr,我將首先按組折疊到各個行,然后計算累積總和:
library(dplyr)
df <- df %>%
group_by(group, rep) %>%
summarise(value = sum(value)) %>%
mutate(csum = cumsum(value))
df
%> Source: local data frame [4 x 4]
%> Groups: group
%>
%> group rep value csum
%> 1 0 d1 0 0
%> 2 0 d2 2 2
%> 3 1 d1 2 2
%> 4 1 d2 2 4
對於大多數情況,您最好將數據保留在此表單中(這將更容易工作),但如果您需要,您可以重新塑造:
library(reshape2)
dcast(df, group ~ rep, value.var = "csum")
%> group d1 d2
%> 1 0 0 2
%> 2 1 2 4
library(data.table)
# convert to data.table in place
setDT(df)
# dcast and do individual sums
dt.cast = dcast.data.table(df, group ~ rep, value.var = 'value',
fun.aggregate = sum)
dt.cast
# group d1 d2
#1: 0 0 1
#2: 1 1 2
# cumsum
dt.cast[, as.list(cumsum(unlist(.SD))), by = group]
# group d1 d2
#1: 0 0 1
#2: 1 1 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.