R使用矩阵来选择多维数组的行

时间:2016-01-14 16:58:05

标签: r matrix multidimensional-array indexing

我有一个多维数组,按以下方式创建:

my_array <- array(seq(12), dim=my_dims, dimnames=my_dimnames)

其中&#34; my_dims&#34;是一个数字向量和&#34; my_dimnames&#34;是一个字符向量列表,其长度对应于&#34; mydims&#34;中指定的维度,例如:

my_dims <- c(2, 3, 2)
my_dimnames <- list(c("D_11", "D_12"), c("D_21", "D_22", "D_23"), c("D_31", "D_32"))

所以&#34; my_array&#34;看起来像这样:

, , D_31

     D_21 D_22 D_23
D_11    1    3    5
D_12    2    4    6

, , D_32

     D_21 D_22 D_23
D_11    7    9   11
D_12    8   10   12

此外,我有一个包含每个维度的特定值的字符向量:

my_values <- c("D_11", "D_21", "D_32")

现在,从这个问题:R - how to get a value of a multi-dimensional array by a vector of indices我了解到我可以在&#34; my_array&#34;中的特定单元格中读取和写入值。使用矩阵索引,如下所示:

my_array[matrix(my_values, 1)]

获得价值&#34; 7&#34;和

my_array[matrix(my_values, 1)] <- 1

将相同的单元格设置为值&#34; 1&#34;

我不明白,我是如何从#34; my_array&#34;中获取特定维度的所有值,使用此方法为所有其他维度指定特定值。

例如:如何获得包含具有固定值的第一维的所有值的向量&#34; D_21&#34;和&#34; D_32&#34;第二维和第三维?因此,在这种情况下,我尝试提取的将是以下形式的向量:

c(7, 8)

如何调整矩阵索引以实现此结果?

提前多多感谢!

1 个答案:

答案 0 :(得分:0)

我不知道这样的事情是否已经存在,但正如评论中所述,您可以使用dimnames的{​​{1}}。

最好是你的&#34; my_values&#34;对象是array,因为这会给你很大的灵活性,你不会用矢量。

这是一种可能的方法。创建一个创建list的函数,该函数可用于从数组中进行子集化。该函数基本上看起来像这样:

matrix

提取功能就像这样。 (最有可能的是,你只需将这两个功能同时推出,但我想我会在这里单独分享它们,以便你可以看到发生了什么。)

mat_maker <- function(array, vals) {
  x <- sapply(vals, is.null)
  vals[x] <- dimnames(array)[x]
  as.matrix(expand.grid(vals))
}

现在,请尝试以下示例。注意&#34; vals&#34;参数是array_extractor <- function(array, vals) { array[mat_maker(array, vals)] } list用于未指定的维度。

NULL

此函数的扩展是将维度属性(包括名称)放回输出中。它可能看起来像这样:

## All values where rowname == "D_11"
mat_maker(my_array, list("D_11", NULL, NULL))
#      Var1   Var2   Var3  
# [1,] "D_11" "D_21" "D_31"
# [2,] "D_11" "D_22" "D_31"
# [3,] "D_11" "D_23" "D_31"
# [4,] "D_11" "D_21" "D_32"
# [5,] "D_11" "D_22" "D_32"
# [6,] "D_11" "D_23" "D_32"
array_extractor(my_array, list("D_11", NULL, NULL))
# [1]  1  3  5  7  9 11


## All first column values from the second array object
## This is your specific example
mat_maker(my_array, list(NULL, "D_21", "D_32"))
#      Var1   Var2   Var3  
# [1,] "D_11" "D_21" "D_32"
# [2,] "D_12" "D_21" "D_32"
array_extractor(my_array, list(NULL, "D_21", "D_32"))
# [1] 7 8

## First two columns from all array dimensions
array_extractor(my_array, list(NULL, c("D_21", "D_22"), NULL))
# [1]  1  2  3  4  7  8  9 10

以下是用法:

extractMe <- function(array, vals) {
  x <- sapply(vals, is.null)
  vals[x] <- dimnames(array)[x]
  temp <- as.matrix(expand.grid(vals))
  `dimnames<-`(`dim<-`(array[temp], lengths(vals)), vals)
}

并且,对于您只想要值的向量的情况,只需用extractMe(my_array, list("D_11", NULL, NULL)) # , , D_31 # # D_21 D_22 D_23 # D_11 1 3 5 # # , , D_32 # # D_21 D_22 D_23 # D_11 7 9 11 extractMe(my_array, list(NULL, "D_21", "D_32")) # , , D_32 # # D_21 # D_11 7 # D_12 8 extractMe(my_array, list(NULL, c("D_21", "D_22"), NULL)) # , , D_31 # # D_21 D_22 # D_11 1 3 # D_12 2 4 # # , , D_32 # # D_21 D_22 # D_11 7 9 # D_12 8 10 包裹它:

c