簡體   English   中英

如何在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

grouprep獲得累積金額的最佳方法是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM