R数组子集化:drop的灵活使用
R Array subsetting: flexible use of drop
正如在 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
我想要一种通过删除第 3 个维度(实际上是我放置子集 1 的维度)并保留第 1 个维度(没有放置子集的维度)来进行子集化的方法。
它应该return一个维度为 1 2 4 的数组
我的问题是,我开始使用没有维度 = 1 的数组进行编码,但是在处理某些维度为 1 的情况时,它崩溃了。我需要的函数提供了一种处理数组的方法,就好像维度不是1一样。
有两种方法可以做到这一点,要么使用包 abind
中的 adrop
,要么在进行子集化后使用您选择的维度构建一个新数组。
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)
正如在 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
我想要一种通过删除第 3 个维度(实际上是我放置子集 1 的维度)并保留第 1 个维度(没有放置子集的维度)来进行子集化的方法。
它应该return一个维度为 1 2 4 的数组
我的问题是,我开始使用没有维度 = 1 的数组进行编码,但是在处理某些维度为 1 的情况时,它崩溃了。我需要的函数提供了一种处理数组的方法,就好像维度不是1一样。
有两种方法可以做到这一点,要么使用包 abind
中的 adrop
,要么在进行子集化后使用您选择的维度构建一个新数组。
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)