假设我有一个三维数组:
set.seed(1)
foo <- array(rnorm(250),dim=c(5,10,5))
我想在第4,5和6列上创建每行和每层的矩阵。我可以这样写:
apply(foo[,4:6,],c(1,3),sum)
但是这会按行和每层分割数组,因为它没有矢量化,所以非常慢。我也可以添加切片:
foo[,4,]+foo[,5,]+foo[,6,]
哪个更快但是为多个切片手动操作变得非常繁琐。是否有一个函数可以在不手动指定每个切片的情况下执行上述表达式?
答案 0 :(得分:8)
我认为您正在寻找rowSums / colSums
(apply
的快速实施)
colSums(aperm(foo[,4:6,], c(2,1,3)))
> all.equal(colSums(aperm(foo[,4:6,], c(2,1,3))), foo[,4,]+foo[,5,]+foo[,6,])
[1] TRUE
答案 1 :(得分:0)
这个怎么样:
eval(parse(text=paste(sprintf('foo[,%i,]',4:6),collapse='+')))
我知道有理由避免parse
,但在这种情况下我不确定如何避免它。