R 按组计算
假设数据看起来像R 按组计算,r,cumsum,R,Cumsum,假设数据看起来像 group1 group2 num A sg 1 A sh 2 A sg 4 B at 3 B al 7 a库(data.table) 数据除了使用数据。表,基本R中的tapply适用于以下两种情况: dta <- read.table(text=" group1 group2 num A sg 1 A sh 2 A sg 4
group1 group2 num
A sg 1
A sh 2
A sg 4
B at 3
B al 7
a库(data.table)
数据除了使用数据。表
,基本R中的tapply
适用于以下两种情况:
dta <- read.table(text="
group1 group2 num
A sg 1
A sh 2
A sg 4
B at 3
B al 7", header=TRUE)
dta$cumsum <- do.call(c, tapply(dta$num, dta$group1, FUN=cumsum))
例如:ave(df$num,df$group1,FUN=cumsum)
用于两个组的求和,只要group1
或ave(df$num,df$group1,df$group2,FUN=cumsum)
。使用data.table
setDT(data)[,cumsum(num),list(group1,group2)]
或data%>%groupby(group1,group2)%%>%mutate(sum=cumsum(num))
与dplyr
@nicola没有注意到ave
有选择FUN
@阿克伦。我没听说过这个包裹。我等会再查。语法看起来很奇怪。@W\u请查看data.table
或dplyr
中的哪一个dplyr
是为了让事情更容易理解而创建的。很好!为了类型安全起见,我只想在tapply()
调用中添加simplify=FALSE
。
group1 group2 sum
A sg 1
A sh 2
A sg 5
B at 3
B al 7
library(data.table)
data <- data.table(group1=c('A','A','A','B','B'),sum=c(1,2,4,3,7))
data[,list(cumsum = cumsum(sum)),by=list(group1)]
dta <- read.table(text="
group1 group2 num
A sg 1
A sh 2
A sg 4
B at 3
B al 7", header=TRUE)
dta$cumsum <- do.call(c, tapply(dta$num, dta$group1, FUN=cumsum))
dta <- dta[order(dta$group1, dta$group2, dta$num),]
dta$cumsum2 <- do.call(c, tapply(dta$num,
paste0(dta$group1, dta$group2),
FUN=cumsum))
dta
group1 group2 num cumsum cumsum2
1 A sg 1 1 1
3 A sg 4 7 5
2 A sh 2 3 2
5 B al 7 10 7
4 B at 3 3 3
dta[as.numeric(rownames(dta)),]
group1 group2 num cumsum cumsum2
1 A sg 1 1 1
2 A sh 2 3 2
3 A sg 4 7 5
4 B at 3 3 3
5 B al 7 10 7