R阵列子集:灵活使用drop

时间:2016-02-08 09:57:16

标签: arrays r subset dimension

正如Subsetting R array: dimension lost when its length is 1中所注意到的那样 当子集化时,R会丢弃每个维度,其长度为1。

drop属性有助于避免这种情况。 我需要一种更灵活的子集方式:

> arr = array(1, dim= c(1,2,3,4))
> dim(arr[,,1,])
[1] 2 4
> dim(arr[,,1,,drop=F])
[1] 1 2 1 4

我希望通过删除第三维(实际上是我放置子集1的维度)和保持第一维(未放置子集的维度)来进行子集化。

它应该返回一个维数= 1 2 4

的数组

我的问题是我开始使用没有维度= 1的数组进行编码,但是当处理维度为1的某些情况时,它会崩溃。我需要的函数提供了一种处理数组的方法,就好像维度不是1.

1 个答案:

答案 0 :(得分:0)

执行此操作的两种方法,或者使用adrop包中的abind,或者在进行子设置后使用您选择的尺寸构建新数组。

library(abind)
arr  <- array(sample(100, 24), dim=c(1, 2, 3, 4))
arr2 <- adrop(arr[ , , 1, , drop=FALSE], drop=3)
dim(arr2)
arr3 <- array(arr[ , , 1 , ], dim=c(1,2,4))
identical(arr2, arr3)

如果您想要一个函数使用单个指定的边距和该边距的单个索引,然后删除该边距以创建一个仅具有一个少的边距的新数组,那么下面是使用abind的方法:

specialsubset <- function(ARR, whichMargin, whichIndex) {
   library(abind)
   stopifnot(length(whichIndex) == 1, length(whichMargin) == 1, is.numeric(whichMargin))
   return(adrop(x = asub(ARR, idx = whichIndex, dims = whichMargin, drop = FALSE), drop = whichMargin))
}
arr4 <- specialsubset(arr, whichMargin=3, whichIndex=1)
identical(arr4, arr2)
相关问题