如何从列表中提取矩阵对象而不再是列表?

时间:2015-11-05 16:24:11

标签: r list matrix

我想提取一个矩阵列表的矩阵。但是,此提取的矩阵不应再是列表。可能很容易做到这一点,但我找不到解决方案。这里有一些示例数据:

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()=矩阵而不是列表提取一个矩阵? 感谢

2 个答案:

答案 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)进行子集化将返回类似于[[的基础对象。