矩阵列表上的R冒号算子
我在R中创建了一个矩阵列表。在列表中的所有矩阵中,我想“拉出”特定索引的矩阵元素集合。我在想冒号操作符可能允许我在一行中实现这一点。例如,这里尝试访问列表中所有矩阵的[1,1]元素:矩阵列表上的R冒号算子,r,list,collections,matrix,indexing,R,List,Collections,Matrix,Indexing,我在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)
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]
有人知道如何在一条生产线上进行上述操作吗
请注意,我的“矩阵列表”可以替换为其他内容。如果有人能建议一种替代的“矩阵集合”数据结构,允许我执行上述操作,那么这将得到解决
也许这个问题很傻……不过我真的希望有一个干净的单行实现 两件事。首先是
[
和[[
之间的区别。中的相关句子?'['
:
[,[]和$之间最重要的区别是,[可以
选择多个元素,而其他两个选择单个元素
元素
因此,您可能需要执行
myList[1:2]
。其次,您不能按照描述的方式组合子集操作。一旦执行myList[1:2]
,您将得到一个包含两个矩阵的列表。一个列表通常只有一个维度,因此在您的情况下执行myList[1:2][1,1]
是毫无意义的(请参阅注释了解例外情况)
您可以尝试使用lappy
来代替:lappy(myList,[',1,1)
这可以:
> sapply(myList,"[",1,1)
[1] 1 2
编辑:哦,对不起,我在前面的答案末尾看到了几乎相同的想法。但是sapply可能更接近你想要的,无论如何如果你的矩阵都有相同的维数,你可以将它们存储在三维数组中。这肯定会使索引和提取元素更容易
## 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
##将数据放入数组的一种方法
a与问题完全无关,但作为对“列表只有一个维度”的回应:您可以使用dim()
为列表提供更多维度。例如foomyList[1:2][1,1]
仍然毫无意义,尽管myList[1:2]
将返回只有一个维度的列表:)