2014-02-18 6 views
1

값이 1, 2 또는 3 (및 일부 NA) 인 거대한 행렬이 있습니다. 행렬이 n × m이면 원래 행렬의 각 값이 새로운 행렬의 3 개 항목에 해당하는 n × 3m으로 다시 코딩해야합니다. 값이 오래된 행렬에서 x이면 x 번째 항목은 1이되고 다른 두 개는 0이됩니다 (NA가 모두 0 인 경우).R에 거대한 행렬을 재 코딩

1, 3, NA, 1 

1 0 0 0 0 1 0 0 0 1 0 0 

에 레코딩 즉

1 = 1 0 0 
3 = 0 0 1 
NA = 0 0 0 
1 = 1 0 0 

매트릭스가 거대하기 때문에 R에서이 작업을 효율적으로 수행해야합니다. 가장 효율적인 방법은 무엇입니까? 행렬은 data.table에 있습니다.

+1

'Matrix' 패키지는 스파 스 매트릭스를 지원합니다.이 경우 유용합니다. – nograpes

+0

RAM과 CPU (최소한)에 관련 될 수 있으므로 "효율적인"이란 의미를 더 분명하게 표현해야합니다. 행렬을 단일 열 data.tables로 분해하고'foreach' 패키지를 사용하여 사용 가능한 모든 코어를 사용하는 것이 훨씬 빠를 수도 있습니다. ** m ** 및 ** n **의 상대 크기에 따라 다릅니다. – Peter

답변

3

미리 할당 된 빈 행렬을 사용합니다.

mat <- matrix(c(1,3,NA,1,1,3,NA,1),nrow=2,byrow=TRUE) 
mat 

#  [,1] [,2] [,3] [,4] 
#[1,] 1 3 NA 1 
#[2,] 1 3 NA 1 

newmat <- matrix(0, ncol=ncol(mat)*3, nrow=nrow(mat)) 
ind <- cbind(rep(1:nrow(mat),ncol(mat)), as.vector(mat + (col(mat)*3-3))) 
newmat[ind] <- 1 

newmat 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] 
#[1,] 1 0 0 0 0 1 0 0 0  1  0  0 
#[2,] 1 0 0 0 0 1 0 0 0  1  0  0 

또한 Matrix 패키지에서 희소 행렬과이 방법을 사용할 수 있습니다.

library(Matrix) 
newmat <- Matrix(0, ncol=ncol(mat)*3, nrow=nrow(mat),sparse=TRUE) 
newmat[ind[complete.cases(ind),]] <- 1 

newmat 
#2 x 12 sparse Matrix of class "dgCMatrix" 
#        
#[1,] 1 . . . . 1 . . . 1 . . 
#[2,] 1 . . . . 1 . . . 1 . . 

스파 스 매트릭스를 사용하면 메모리 사용이 크게 줄어들어 여러 가지 이점이 있습니다.

관련 문제