我一直在尝试编写代码:对于每个
到目前为止,我想出的最好方法是使用循环。这是一个例子
y=rnorm(10)
x=c(1,1,1,2,2,2,3,3,3,4)
z=c(5,5,6,6,7,7,8,8,9,9)
data=data.frame(y,x,z)
n=10
s=rep(NA,length(unique(x))*length(unique(z)))
dim(s)=c(length(unique(x)),length(unique(z)))
for (i in 1:length(unique(x))){
for (j in 1:length(unique(z))){
s[i,j]=sum(y*as.numeric((x<=unique(x)[i]))*
as.numeric((z<=unique(z)[j])))
}
}
输出是这样的,但是当我的尺寸增加时,这变得低效。因为对于给定的 z,这看起来像是一个条件累积和,所以我 100% 确信有一种更有效的方法可以做到这一点,而无需循环。
你们有什么建议吗?如果我没有 z,我知道我可以使用 data.table:
s=data[order(x)][,lapply(.SD, sum),by=c("x"), .SDcols=c("y")]
s=s[,lapply(.SD, cumsum), .SDcols=c("y")]
但是有多个索引(x 和 z,而不仅仅是 x)我无法制定程序。