我想提取一个矩阵列表的矩阵。但是,此提取的矩阵不应再是列表。可能很容易做到这一点,但我找不到解决方案。这里有一些示例数据:
x = list(a = matrix(sample(1:5,4) , nrow=2, ncol=2),
b = matrix(sample(5:10,4) , nrow=2, ncol=2),
c = matrix(sample(10:15,4) , nrow=2, ncol=2))
我按名称选择了一个矩阵(这在我的情况下很重要,因为我有超过1000个矩阵),但它仍然是一个项目的列表:
new <- x["b"]
我尝试了as.matrix(new)
,它返回了不同的东西。还有lapply(new, function(r){r["b"]})
。我的问题:如何使用str()=矩阵而不是列表提取一个矩阵?
感谢
答案 0 :(得分:1)
您可以使用x[['b']]
或x$b
x = list(a = matrix(sample(1:5,4) , nrow=2, ncol=2),
b = matrix(sample(5:10,4) , nrow=2, ncol=2),
c = matrix(sample(10:15,4) , nrow=2, ncol=2))
x[['b']]
[,1] [,2]
[1,] 6 10
[2,] 9 7
x$b
[,1] [,2]
[1,] 6 10
[2,] 9 7
以下是两个解决方案之间的microbenchmark
:
microbenchmark(x[['b']],x$b)
Unit: nanoseconds
expr min lq mean median uq max neval cld
x[["b"]] 351 701 756.80 701 701 3851 100 a
x$b 700 701 942.33 701 1050 15400 100 a
答案 1 :(得分:1)
R中有两个常见的子集操作?"["
和?"[["
。它们之间的区别在于[
返回与“父”对象相同类型的子集。 case一个列表,而[[
返回子集对象类型中的对象。
所以:
l <- list(v= 1:10, # a vector
m= matrix(1:4, 2,2), # a matrix
l2= list(a= c("a", "b", "c"), b= c("d", "e", "f")))
l[1] # all of these will return
l[2] # a list of length one
l[3] # containing the object in the list "l"
l[[1]] # will return a vector
l[[2]] # will return a matrix
l[[3]] # will return a list
如果您有一个命名列表(如上所述l
),则通过名称(例如l$v
)进行子集化将返回类似于[[
的基础对象。