正如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.
答案 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)