我有一个多维数组,按以下方式创建:
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)
如何调整矩阵索引以实现此结果?
提前多多感谢!
答案 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