2015-11-05 76 views
0

我想提取矩阵列表中的一个矩阵。但是,这个提取的矩阵不应再是一个列表。可能很容易做到这一点,但我找不到解决方案。这里是一些示例数据:如何从列表中提取矩阵对象而不再是列表?

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

+1

尝试'新的< - x [[“b”]]'看看这个鸣叫](https://twitter.com/hadleywickham/status/643381054758363136)为一个容易记住的例子 – jeremycg

+1

对不起,我再次尝试和这工作正常......也许我会在电脑前长:) –

+1

然后你的代码有问题,因为'x [['b']]'是正确的答案,你应该检查您的列表 – etienne

回答

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 

这里是2个解决方案之间的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

有两种常见的子集操作?"["?"[["在河之间的区别它们是[返回与“父”对象相同类型的子集,在你的情况下是一个列表,而[[ r在子集对象的类型中蚀刻对象。

所以:

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)将返回类似于[[基本对象。