2

我在 R 中创建了一个矩阵列表。在列表中的所有矩阵中,我想“拉出”特定索引的矩阵元素的集合。我在想冒号运算符可能允许我在一行中实现这一点。例如,这里尝试访问列表中所有矩阵的 [1,1] 元素:

myList = list() #list of matrices
myList[[1]] = matrix(1:9, nrow=3, ncol=3, byrow=TRUE) #arbitrary data
myList[[2]] = matrix(2:10, nrow=3, ncol=3, byrow=TRUE)

#I expected the following line to output myList[[1]][1,1], myList[[2]][1,1]
slice = myList[[1:2]][1,1] #prints error: "incorrect number of dimensions"

上述代码的最后一行抛出错误“维度数不正确”。

作为参考,这是我正在尝试做的工作(但不太优雅)的实现:

#assume myList has already been created (see the code snippet above)
slice = c()
for(x in 1:2) {
    slice = c(slice, myList[[x]][1,1])
}
#this works. slice = [1 2]

有谁知道如何在一行中完成上述操作?

请注意,我的“矩阵列表”可以替换为其他内容。如果有人可以建议允许我执行上述操作的替代“矩阵集合”数据结构,那么这将得到解决。

也许这个问题很愚蠢......我真的很想有一个干净的单行实现。

4

3 回答 3

4

两件事情。[首先,和的区别[[。相关句子来自?'['

[、[[ 和 $ 之间最重要的区别是 [ 可以选择多个元素,而其他两个选择单个元素。

所以你可能想这样做myList[1:2]。其次,您不能以您描述的方式组合子集操作。完成后,myList[1:2]您将获得两个矩阵的列表。列表通常只有一个维度,因此myList[1:2][1,1]在您的情况下这样做是荒谬的。(有关例外情况,请参阅注释。)

你可以试试lapplylapply(myList,'[',1,1).

于 2012-05-10T03:12:47.083 回答
4

如果您的矩阵都具有相同的维度,则可以将它们存储在 3 维数组中。这肯定会使索引和提取元素更容易......

## One way to get your data into an array
a <- array(c(myList[[1]], myList[[2]]), dim=c(3,3,2))

## Extract the slice containing the upper left element of each matrix
a[1,1,]
# [1] 1 2
于 2012-05-10T06:50:59.120 回答
2

这有效:

> sapply(myList,"[",1,1)
[1] 1 2

编辑:哦,对不起,我在较早的答案结束时看到了几乎相同的想法。但无论如何, sapply 可能更接近你想要的

于 2012-05-10T04:14:19.433 回答