R'deki vektörler listesinden nasıl matris yaparım?


102

Hedef: eşit uzunluktaki vektörlerin listesinden, her vektörün bir satır haline geldiği bir matris oluşturun.

Misal:

> 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

İstiyorum:

      [,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 

Yanıtlar:


124

Bir seçenek kullanmaktır 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
Yani bununla standart rbind () arasındaki fark, do.call () öğesinin her liste öğesini ayrı bir argüman olarak geçirmesidir - doğru mu? do.call (rbind, a), rbind (a [[1]], a [[2]] ... a [[10]]) ile eşdeğerdir?
Matt Parker

5
do.call () bu amaç için harikadır, keşke giriş materyallerinde daha iyi "belgelenmiş" olsaydı.
andrewj

16

simplify2arrayoldukça sezgisel bir temel işlevdir. Bununla birlikte, R'nin varsayılanı verileri önce sütunlarla doldurmak olduğundan, çıktının transpoze edilmesi gerekecektir. ( belgelendiği gibi sapplykullanır .)simplify2arrayhelp(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

Basit değil ama işe yarıyor:

> 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
İle rjsonsonuçları, colMeanssadece bu yöntem için çalışıyor! Teşekkür ederim!
mpyw

10

Yerleşik matrixişlev, veri girmek için güzel bir seçeneğe sahiptir byrow. Bunu unlistkaynak listenizdeki bir ile birleştirmek size bir matris verecektir. Listelenmemiş verileri bölebilmesi için satır sayısını da belirlememiz gerekir. Yani:

> 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

Ya sütunlarla bir matris doldurmak ve ardından devrik: t( matrix( unlist(a), ncol=length(a) ) ).
Kalin

8
t(sapply(a, '[', 1:max(sapply(a, length))))

burada 'a' bir listedir. Eşit olmayan satır boyutu için işe yarar


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, ...) hala çalışıyorken, satırlar aynı uzunlukta değilse bu işe yaramayacaktır.
ilk

Eksik satır verileri için NA ile eşit olmayan satır boyutu için nasıl çalışacağına dair herhangi bir ipucu var mı?
Arihant

1
@rwst Gerçekte do.call (rbind, ...), sonunda satırı doldururken vektörün yeniden kullanılmasını gerçekten istemediğiniz sürece eşit olmayan uzunluklu vektörler için çalışmaz. NABunun yerine, sonunda değerlerle doldurulacak bir yol için Arihant'ın yanıtına bakın .
Kalin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.