Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按组计算_R_Cumsum - Fatal编程技术网

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