按组别累计
Cumulative total by group
对于以下数据集:
d = data.frame(date = as.Date(as.Date('2015-01-01'):as.Date('2015-04-10'), origin = "1970-01-01"),
group = rep(c('A','B','C','D'), 25), value = sample(1:100))
head(d)
date group value
1: 2015-01-01 A 4
2: 2015-01-02 B 32
3: 2015-01-03 C 46
4: 2015-01-04 D 40
5: 2015-01-05 A 93
6: 2015-01-06 B 10
.. 谁能建议一种比 data.table) 方法更优雅的方法来按组计算值的累计总数?
library(data.table)
setDT(d)
d.cast = dcast.data.table(d, group ~ date, value.var = 'value', fun.aggregate = sum)
c.sum = d.cast[, as.list(cumsum(unlist(.SD))), by = group]
.. 这很笨重,会产生一个平面矩阵,需要 dplyr::gather
或 reshape2::melt
重新格式化。
R 肯定能做得比这更好吗??
如果你只想要每组的累计和,那么你可以这样做
transform(d, new=ave(value,group,FUN=cumsum))
以 R 为基数。
这应该有效
library(dplyr)
d %>%
group_by(group) %>%
arrange(date) %>%
mutate(Total = cumsum(value))
由于这个问题被标记为 data.table
,您可能正在寻找(@Franks 评论的修改)。
setDT(d)[order(date), new := cumsum(value), by = group]
这将同时按 date
重新排列数据(不确定是否需要,如果不需要,您可以删除 order(date)
)并更新您的数据集 就地 利用 :=
运算符
是这个吗?
sp <- split(d, d$group)
res <- lapply(seq_along(sp), function(i) cumsum(sp[[i]]$value))
res <- lapply(seq_along(res), function(i){
sp[[i]]$c.sum <- res[[i]]
sp[[i]]
})
res <- do.call(rbind, res)
res
对于以下数据集:
d = data.frame(date = as.Date(as.Date('2015-01-01'):as.Date('2015-04-10'), origin = "1970-01-01"),
group = rep(c('A','B','C','D'), 25), value = sample(1:100))
head(d)
date group value
1: 2015-01-01 A 4
2: 2015-01-02 B 32
3: 2015-01-03 C 46
4: 2015-01-04 D 40
5: 2015-01-05 A 93
6: 2015-01-06 B 10
.. 谁能建议一种比 data.table) 方法更优雅的方法来按组计算值的累计总数?
library(data.table)
setDT(d)
d.cast = dcast.data.table(d, group ~ date, value.var = 'value', fun.aggregate = sum)
c.sum = d.cast[, as.list(cumsum(unlist(.SD))), by = group]
.. 这很笨重,会产生一个平面矩阵,需要 dplyr::gather
或 reshape2::melt
重新格式化。
R 肯定能做得比这更好吗??
如果你只想要每组的累计和,那么你可以这样做
transform(d, new=ave(value,group,FUN=cumsum))
以 R 为基数。
这应该有效
library(dplyr)
d %>%
group_by(group) %>%
arrange(date) %>%
mutate(Total = cumsum(value))
由于这个问题被标记为 data.table
,您可能正在寻找(@Franks 评论的修改)。
setDT(d)[order(date), new := cumsum(value), by = group]
这将同时按 date
重新排列数据(不确定是否需要,如果不需要,您可以删除 order(date)
)并更新您的数据集 就地 利用 :=
运算符
是这个吗?
sp <- split(d, d$group)
res <- lapply(seq_along(sp), function(i) cumsum(sp[[i]]$value))
res <- lapply(seq_along(res), function(i){
sp[[i]]$c.sum <- res[[i]]
sp[[i]]
})
res <- do.call(rbind, res)
res