我在 R 中練習矩陣問題的基礎知識,最終知道以下問題之一的解決方案:
l <- list()
for (i in 1:5) l[[i]] <- c(i, 1:4)
mat_list <- do.call(rbind, l)
雖然,我已經了解do.call作業原理,但我直接嘗試使用創建矩陣rbind,輸出如下:
rbind(l)
# [,1] [,2] [,3] [,4] [,5]
# l integer,5 integer,5 integer,5 integer,5 integer,5
我試圖了解 google 上的輸出,但是,沒有一個是令人滿意的。請幫助理解輸出。
uj5u.com熱心網友回復:
當您更仔細地查看生成的物件時,它會變得更加明顯。一般來說,do.call將每個串列元素一一給rbind。rbind像串列一樣在一個物件上手動使用會查看整個串列。見下文。
筆記:
'do.call' 從名稱或函式以及要傳遞給它的引數串列構造并執行函式呼叫。
函式呼叫 withdo.call從串列的每個向量生成一個矩陣作為行。
lis
[[1]]
[1] 1 1 2 3 4
[[2]]
[1] 2 1 2 3 4
[[3]]
[1] 3 1 2 3 4
[[4]]
[1] 4 1 2 3 4
[[5]]
[1] 5 1 2 3 4
do.call(rbind,lis)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 2 3 4
[2,] 2 1 2 3 4
[3,] 3 1 2 3 4
[4,] 4 1 2 3 4
[5,] 5 1 2 3 4
這與從每個向量手動執行相同
rbind( c(1, 1:4), c(2, 1:4) )
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 2 3 4
[2,] 2 1 2 3 4
# etc...
手動使用rbind串列上的函式是不同的操作。它不會解構串列,也不會查看每個向量元素。
rbind(lis)
[,1] [,2] [,3] [,4] [,5]
lis Integer,5 Integer,5 Integer,5 Integer,5 Integer,5
# put in a data.frame to see the vectors
data.frame(rbind(lis))
X1 X2 X3 X4 X5
lis 1, 1, 2, 3, 4 2, 1, 2, 3, 4 3, 1, 2, 3, 4 4, 1, 2, 3, 4 5, 1, 2, 3, 4
# compare with cbind used this way
data.frame(cbind(lis))
lis
1 1, 1, 2, 3, 4
2 2, 1, 2, 3, 4
3 3, 1, 2, 3, 4
4 4, 1, 2, 3, 4
5 5, 1, 2, 3, 4
如果您想處理物件的單個元素,也就是分別評估每個元素,您可以在作業流程中利用這些不同的行為。
uj5u.com熱心網友回復:
rbind實際上是為按行將向量系結到矩陣而設計的。如果我們有兩個長度為 5 的向量,結果是一個有兩行五列的矩陣。
rbind(0:4, 5:9)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 1 2 3 4
# [2,] 5 6 7 8 9
如果系結一個或者list說相同的兩個整數向量,我們只有一個串列,因此只有一行。
rbind(list(0:4, 5:9))
# [,1] [,2]
# [1,] integer,5 integer,5
如果我們嘗試rbind兩個串列,我們會得到兩行。
rbind(list(0:4, 5:9), list(0:4, 5:9))
# [,1] [,2]
# [1,] integer,5 integer,5
# [2,] integer,5 integer,5
長度為5的第一個整數向量隱藏在第一列中,第二個隱藏在第二列中,依此類推。
rbind(list(0:4, 5:9))[1, 1][[1]]
# [1] 0 1 2 3 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394684.html
