Arrays 基于维度名称聚合数组
我试图以一种有效的方式基于维度名称聚合数组Arrays 基于维度名称聚合数组,arrays,r,matrix,aggregate,Arrays,R,Matrix,Aggregate,我试图以一种有效的方式基于维度名称聚合数组 ex_array <- array(1:10000, dim = c(100, 10, 10), dimnames = list(Col1 = c(rep(10,50), rep(20, 50)), Col2 = 1:10, Col3 = 1:10)) ex_array要仅对
ex_array <- array(1:10000, dim = c(100, 10, 10),
dimnames = list(Col1 = c(rep(10,50), rep(20, 50)),
Col2 = 1:10,
Col3 = 1:10))
ex_array要仅对一个维度名称执行此操作,它可以是:
apply( ex_array[dimnames(ex_array)[[1]] == "10",,], 2:3, sum)
如果你将其包装在一个sapply
调用中,你会得到一个2xprod(N1,N2)
矩阵,其中包含正确的信息。我使用了示例数据集的缩小版本:
ex_array <- array(1:360, dim = c(10, 6, 6),
dimnames = list(Col1 = c(rep(10,5), rep(20,5 )),
Col2 = 1:6,
Col3 = 1:6))
str( sapply(unique(dimnames(ex_array)[[1]]), function(x) apply( ex_array[dimnames(ex_array)[[1]] == x,,], 2:3, sum)) )
int [1:36, 1:2] 15 65 115 165 215 265 315 365 415 465 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "10" "20"
重塑2。如果您愿意使用以下软件包,我认为重塑2最适合这里:
library(reshape2)
res = acast(melt(ex_array), Col1 ~ Col2 ~ Col3, fun.aggregate = sum)
str(res)
# int [1:2, 1:10, 1:10] 1275 3775 6275 8775 11275 13775 16275 18775 21275 23775 ...
# - attr(*, "dimnames")=List of 3
# ..$ : chr [1:2] "10" "20"
# ..$ : chr [1:10] "1" "2" "3" "4" ...
# ..$ : chr [1:10] "1" "2" "3" "4" ...
我认为这也会折叠其他维度名称中的重复项(如果有的话)
基本R.您可以使用行和
,但它在这里很笨重,因为它是为矩阵设计的
res2 = array(, c(2, 10, 10), dimnames = lapply(dimnames(ex_array), unique))
res2[] = sapply(seq_len(dim(ex_array)[3]), function(k)
rowsum(ex_array[,,k], rownames(ex_array[,,k])))
当我在执行我的计划时,我想如果使用restrape2
或splitstackshape
或dplyr
函数,这可能会看起来更紧凑。(我认为这也是正确的结果。)
library(reshape2)
res = acast(melt(ex_array), Col1 ~ Col2 ~ Col3, fun.aggregate = sum)
str(res)
# int [1:2, 1:10, 1:10] 1275 3775 6275 8775 11275 13775 16275 18775 21275 23775 ...
# - attr(*, "dimnames")=List of 3
# ..$ : chr [1:2] "10" "20"
# ..$ : chr [1:10] "1" "2" "3" "4" ...
# ..$ : chr [1:10] "1" "2" "3" "4" ...
res2 = array(, c(2, 10, 10), dimnames = lapply(dimnames(ex_array), unique))
res2[] = sapply(seq_len(dim(ex_array)[3]), function(k)
rowsum(ex_array[,,k], rownames(ex_array[,,k])))