Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
Arrays 基于维度名称聚合数组_Arrays_R_Matrix_Aggregate - Fatal编程技术网

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])))