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의 기본값은 먼저 열로 데이터를 채우는 것이므로 출력을 전치해야합니다. (sapplysimplify2array 설명 된대로를 사용합니다 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

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

여기서 'a'는 목록입니다. 동일하지 않은 행 크기에 대해 작동합니다.


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 2014 년

1
@rwst 실제로 do.call (rbind, ...)은 길이가 다른 벡터에 대해 작동하지 않습니다. 단, 마지막 행을 채울 때 실제로 벡터를 재사용하지 않으려는 경우입니다. NA대신 끝에 값 을 채우는 방법은 Arihant의 응답을 참조하십시오 .
Kalin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.