灵活的数组子集

时间:2014-03-20 15:10:30

标签: arrays r

我想编写一个函数,它将具有可变维数(例如dim(X) => c(2,3)dim(X) => c(2,3,5))的数组X作为输入,以及维度索引列表和数字指数。该函数根据指定的维度和索引返回数组的子集。例如:

dim(B) => c(2,5,10)
FUN(B, list(list(2,1:3), list(3,6:10))) => B[, 1:3, 6:10]

挑战来自B的尺寸未事先指定的事实。我能想出的最佳解决方案是生成一个字符串s <- "B[,1:3, 6:10]"(详细信息省略并且不重要),然后发出一个eval(parse(text = s))。我不认为这是一个优雅的解决方案,也可能不是一个有效的解决方案。我想知道是否有人能想出一个简单的方法。

1 个答案:

答案 0 :(得分:1)

这是 similar to this earlier question 。一般策略是为所有维度生成索引列表,其中非指定维度由单个TRUE表示,然后允许您使用[调用do.call

sub_arr <- function(X, lst) {
  dim.list <- as.list(rep(T, length(dim(X))))
  dim.list[vapply(lst, `[[`, 1, 1)] <- lapply(lst, `[[`, 2)
  do.call(`[`, c(list(X), dim.list))
}
B <- array(1:16, dim=rep(2, 4))
sub_arr(B, list(list(2, 1:2), list(3, 1)))

产地:

, , 1
     [,1] [,2]
[1,]    1    3
[2,]    2    4
, , 2
     [,1] [,2]
[1,]    9   11
[2,]   10   12    

identical(
  B[, 1:2, 1, ],
  sub_arr(B, list(list(2, 1:2), list(3, 1)))
)
# [1] TRUE