2017-01-27 57 views
1

我在操作从列表列表创建的矩阵时遇到了一些麻烦。我不明白为什么产生的矩阵不像一个普通的矩阵。也就是说,我希望当我为它返回一个向量的列时,我会得到一个列表。这是一个工作示例:对从列表中创建的矩阵进行子集设置

x = list() 
x[[1]] = list(1, 2, 3) 
x[[2]] = list(4, 5, 6) 
x[[3]] = list(7, 8, 9) 

y = do.call(rbind, x) 
y 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 7 8 9 

y是我期望的格式。最终,我将列出我想要平均的这些矩阵,但是我一直得到一个错误,这似乎是由于这样一个事实:当你对这个矩阵进行子集化时,你会得到列表而不是矢量。

y[,1] 
[[1]] 
[1] 1 

[[2]] 
[1] 4 

[[3]] 
[1] 7 

有没有人知道a)为什么会发生这种情况?和b)我怎样才能避免/解决这个问题?

在此先感谢

回答

1

这只是“列表矩阵”的另一个问题。您需要

do.call(rbind, lapply(x, unlist)) 

或更简单:

matrix(unlist(x), nrow = length(x), byrow = TRUE) 

如果你需要一些背景阅读,请参阅:Why a row of my matrix is a list。这是比你更复杂的情况。

1

看起来问题是由于x是一个列表列表,而不是一个向量列表。这是不是很大,但它会工作:

y = do.call(rbind, lapply(x, unlist)) 
+0

任何想法为什么从列表列表中产生的矩阵与向量列表的工作方式不同? 我的假设是,一旦它是一个矩阵,它将像矩阵一样工作。也许有矩阵的亚型? – SamPassmore

0

do.call分别通过每个列表的说法,所以你真的只是你的三个列表结合在一起。这就解释了为什么当你调用元素时它们是列表格式。

取消列出x,然后使用sapply创建矩阵。由于R默认先填充列,您需要将其转置以获得所需的矩阵。

y <- t(sapply(x, unlist)) 
相关问题