Bro*_*ieG 5 r apply multidimensional-array
apply仅在一个边距上操作时似乎不会重新组装 3D 阵列。考虑:
arr <- array(
runif(2*4*3),
dim=c(2, 4, 3),
dimnames=list(a=paste0("a", 1:2), b=paste0("b", 1:4), c=paste0("c", 1:3))
)
# , , c = c1
#
# b
# a b1 b2 b3 b4
# a1 0.7321399 0.8851802 0.2469866 0.9307044
# a2 0.5896138 0.6183046 0.7732842 0.6652637
#
# , , c = c2
# b
# a b1 b2 b3 b4
# a1 0.5894680 0.7839048 0.3854357 0.56555024
# a2 0.6158995 0.6530224 0.8401427 0.04044974
#
# , , c = c3
# b
# a b1 b2 b3 b4
# a1 0.3500653 0.7052743 0.42487635 0.5689287
# a2 0.4097346 0.4527939 0.07192528 0.8638655
Run Code Online (Sandbox Code Playgroud)
现在,制作一个 4 x 4 矩阵以在每个 中混洗列arr[, , i],并使用apply矩阵乘法每个a*b子矩阵arr以重新排序它们的列。重点是每次apply迭代的结果都是一个矩阵
cols.shuf.mx <- matrix(c(0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0), ncol=4)
apply(arr, 3, `%*%`, cols.shuf.mx)
# c
# c1 c2 c3
# [1,] 0.8851802 0.78390483 0.70527431
# [2,] 0.6183046 0.65302236 0.45279387
# [3,] 0.7321399 0.58946800 0.35006532
# [4,] 0.5896138 0.61589947 0.40973463
# [5,] 0.9307044 0.56555024 0.56892870
# [6,] 0.6652637 0.04044974 0.86386552
# [7,] 0.2469866 0.38543569 0.42487635
# [8,] 0.7732842 0.84014275 0.07192528
Run Code Online (Sandbox Code Playgroud)
然而,我预计结果是:
# , , c = c1
#
# a 1 2 3 4
# a1 0.8851802 0.7321399 0.9307044 0.2469866
# a2 0.6183046 0.5896138 0.6652637 0.7732842
#
# , , c = c2
#
# a 1 2 3 4
# a1 0.7839048 0.5894680 0.56555024 0.3854357
# a2 0.6530224 0.6158995 0.04044974 0.8401427
#
# , , c = c3
#
# a 1 2 3 4
# a1 0.7052743 0.3500653 0.5689287 0.42487635
# a2 0.4527939 0.4097346 0.8638655 0.07192528
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式获得预期结果plyr::aaply:
aperm(aaply(arr, 3, `%*%`, cols.shuf.mx), c(2, 3, 1))
Run Code Online (Sandbox Code Playgroud)
但想知道是否有一种简单的基本方法来实现这个结果(即我是否在这里遗漏了一些明显的东西来获得所需的结果)。
我意识到这里发生的事情是记录在案的 ( If each call to FUN returns a vector of length n, then apply returns an array of dimension c(n, dim(X)[MARGIN]) if n > 1),但对我来说,如果函数返回一个具有维度的对象,它们基本上会被忽略,这似乎仍然很奇怪。
如果你阅读了帮助页面apply,它基本上与你的第一句话一致。它是采用特定设计设置的,您需要构建一个新函数来执行不同的操作。顺便说一句:这给你相同的结果比那个简单得多aperm(aaply(...)):
arr[ , c(2,1,4,3) , ]
#-------------------------
, , c = c1
b
a b2 b1 b4 b3
a1 0.4089769 0.2875775 0.5281055 0.9404673
a2 0.8830174 0.7883051 0.8924190 0.0455565
, , c = c2
b
a b2 b1 b4 b3
a1 0.9568333 0.5514350 0.1029247 0.6775706
a2 0.4533342 0.4566147 0.8998250 0.5726334
, , c = c3
b
a b2 b1 b4 b3
a1 0.3279207 0.24608773 0.6405068 0.8895393
a2 0.9545036 0.04205953 0.9942698 0.6928034
Run Code Online (Sandbox Code Playgroud)