子集一个R数组,其长度可以为1

时间:2015-10-19 03:05:25

标签: r

我正在使用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]

如何在保留第一维和第二维的同时沿第三维对子数组进行子集化?

1 个答案:

答案 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