我正在使用R中的三维数组,其中维度由用户参数确定,并且第一个维度的长度可以是1或更长。
如果第一个维度的长度为2或更多,则子集化数组可以正常工作:
Arr2 <- array(rnorm(2 * 4 * 7), dim = c(2, 4, 7))
Arr2[,,1]
但是如果第一个维度的长度为1,则子集运算符将返回向量(如果drop = TRUE)或三维数组(如果drop = FALSE):
Arrrrgh <- array(rnorm(1 * 4 * 7), dim = c(1,4,7))
Arrrrgh[,,1]
Arrrrgh[,,1,drop=FALSE]
如何在保留第一维和第二维的同时沿第三维对子数组进行子集化?
答案 0 :(得分:2)
正如您所注意到的,?"["
只有两个选项来控制维度,drop=TRUE
(默认情况下,在这种情况下会同时删除第一维和第三维)和{{1} },它不会丢弃任何维度。这些选项都不会返回drop=FALSE
所需的维度:
c(1, 4)
解决此问题的一种方法是在子集化操作后自己设置维度:
dim(Arrrrgh[,,1])
# NULL
dim(Arrrrgh[,,1,drop=FALSE])
# [1] 1 4 1
您可以将此概括为一个函数,如果它们传递了一个值并且不丢弃任何其他索引,则会删除指定的索引:
`dim<-`(Arrrrgh[,,1], dim(Arrrrgh)[1:2])
# [,1] [,2] [,3] [,4]
# [1,] 0.1548771 0.6833689 -0.7507798 1.271966