2017-01-27 93 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)) 
相關問題