R: 对N维数组进行子集选择

4

请考虑下面这个三维数组:

set.seed(123)
arr = array(sample(c(1:10)), dim=c(3,4,2))

这产生

> arr
, , 1

     [,1] [,2] [,3] [,4]
[1,]   10    9    8    2
[2,]    5    1    4   10
[3,]    6    7    3    5

, , 2

     [,1] [,2] [,3] [,4]
[1,]    6    7    3    5
[2,]    9    8    2    6
[3,]    1    4   10    9

我想将其子集化,例如:

arr[c(1,2), c(2,4), c(1)]

但问题是我不知道(a)这些索引属于哪个维度或者(b)这些索引要应用在哪个维度上。

如何使用索引变量访问一个N维数组?

ll = list(c(1,2), c(2,4), c(1))

arr[ll]              # doesn't work
arr[grid.expand(ll)] # doesn't work
# ..what else?
2个回答

3

使用do.call函数,例如:

do.call(`[`, c(list(arr), ll))

更清晰地,使用一个包装函数:
getArr <- function(...) 
   `[`(arr, ...)

do.call(getArr, ll)

     [,1] [,2]
[1,]   10    5
[2,]    7    3

还有一件事:我如何给子集分配一个值? - Michael Schubert
2
arr <- do.call("[<-", c(list(arr), ll, 100)) - flodel

1

这里有来自 abind 包的 asub 函数:

library(abind)
asub(arr, ll)

这个工具还可以做更多的事情,特别是可以沿着维度子集进行提取(https://dev59.com/z2Mm5IYBdhLWcg3wRdMz#17752012)。值得放在你的工具箱里。


"asub"非常好,我以前不知道。您是否知道是否可以为选择分配值? - Michael Schubert
很不幸地,没有 asub<-,如果这是你真正想要的,我可能会建议你按照我在 ricardo 的回答下面评论的方式去做。 - flodel
这里还有一个afill()函数,文档在这里:http://cran.fhcrc.org/web/packages/abind/index.html - Michael Schubert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接