ฉันจะสร้างเมทริกซ์จากรายการเวกเตอร์ใน R ได้อย่างไร


102

เป้าหมาย: จากรายการเวกเตอร์ที่มีความยาวเท่ากันสร้างเมทริกซ์โดยที่เวกเตอร์แต่ละตัวจะกลายเป็นแถว

ตัวอย่าง:

> a <- list()
> for (i in 1:10) a[[i]] <- c(i,1:5)
> a
[[1]]
[1] 1 1 2 3 4 5

[[2]]
[1] 2 1 2 3 4 5

[[3]]
[1] 3 1 2 3 4 5

[[4]]
[1] 4 1 2 3 4 5

[[5]]
[1] 5 1 2 3 4 5

[[6]]
[1] 6 1 2 3 4 5

[[7]]
[1] 7 1 2 3 4 5

[[8]]
[1] 8 1 2 3 4 5

[[9]]
[1] 9 1 2 3 4 5

[[10]]
[1] 10  1  2  3  4  5

ฉันต้องการ:

      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5 

คำตอบ:


124

ทางเลือกหนึ่งคือใช้do.call():

 > do.call(rbind, a)
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

5
ดังนั้นความแตกต่างระหว่างสิ่งนี้กับ rbind มาตรฐาน () คือ do.call () ส่งผ่านรายการแต่ละรายการเป็นอาร์กิวเมนต์แยกกัน - ใช่หรือไม่? do.call (rbind, a) เทียบเท่ากับ rbind (a [[1]], a [[2]] ... a [[10]])?
Matt Parker

5
do.call () เป็นสิ่งที่ดีสำหรับจุดประสงค์นี้ฉันหวังว่ามันจะดีกว่า "เอกสาร" ในเอกสารเบื้องต้น
andrewj

16

simplify2arrayเป็นฟังก์ชันพื้นฐานที่ค่อนข้างใช้งานง่าย อย่างไรก็ตามเนื่องจากค่าเริ่มต้นของ R คือการกรอกข้อมูลตามคอลัมน์ก่อนคุณจะต้องเปลี่ยนเอาต์พุต ( sapplyใช้simplify2arrayตามที่ระบุในเอกสารhelp(sapply))

> t(simplify2array(a))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

12

ไม่ตรงไปตรงมา แต่ใช้งานได้:

> t(sapply(a, unlist))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

1
ด้วยrjsonผลลัพธ์colMeansใช้ได้กับวิธีนี้เท่านั้น! ขอบคุณ!
mpyw

10

ในตัวฟังก์ชั่นที่มีตัวเลือกที่ดีในการป้อนข้อมูลmatrix byrowเมื่อรวมเข้ากับunlistรายการแหล่งที่มาของคุณจะทำให้คุณได้เมทริกซ์ นอกจากนี้เรายังต้องระบุจำนวนแถวเพื่อให้สามารถแยกข้อมูลที่ไม่อยู่ในรายการได้ นั่นคือ:

> matrix(unlist(a), byrow=TRUE, nrow=length(a) )
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

หรือเติมเมทริกซ์ตามคอลัมน์แล้วทรานสโพส: t( matrix( unlist(a), ncol=length(a) ) ).
Kalin


3
> library(plyr)
> as.matrix(ldply(a))
      V1 V2 V3 V4 V5 V6
 [1,]  1  1  2  3  4  5
 [2,]  2  1  2  3  4  5
 [3,]  3  1  2  3  4  5
 [4,]  4  1  2  3  4  5
 [5,]  5  1  2  3  4  5
 [6,]  6  1  2  3  4  5
 [7,]  7  1  2  3  4  5
 [8,]  8  1  2  3  4  5
 [9,]  9  1  2  3  4  5
[10,] 10  1  2  3  4  5

1
สิ่งนี้จะใช้ไม่ได้ถ้าแถวมีความยาวไม่เท่ากันในขณะที่ do.call (rbind, ... ) ยังใช้งานได้
rwst

เบาะแสใด ๆ ที่จะทำให้มันใช้งานได้กับขนาดแถวที่ไม่เท่ากันกับ NA สำหรับข้อมูลแถวที่หายไป
Arihant

1
@rwst อันที่จริง do.call (rbind, ... ) ใช้ไม่ได้กับเวกเตอร์ที่มีความยาวไม่เท่ากันเว้นแต่คุณตั้งใจจะให้เวกเตอร์กลับมาใช้ใหม่เมื่อเติมในแถวท้าย ดูการตอบสนองของ Arihant สำหรับวิธีที่เติมNAค่าในตอนท้ายแทน
Kalin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.