IT TIP

거대한 벡터 목록을 행렬로 더 효율적으로 변환하는 방법은 무엇입니까?

itqueen 2020. 12. 14. 21:25
반응형

거대한 벡터 목록을 행렬로 더 효율적으로 변환하는 방법은 무엇입니까?


각 요소가 길이 110 인 문자형 벡터 인 길이 130,000의 목록이 있습니다.이 목록을 차원이 1,430,000 * 10 인 행렬로 변환하고 싶습니다. 어떻게하면 더 효율적으로 할 수 있습니까? \ 내 코드는 다음과 같습니다.

output=NULL
for(i in 1:length(z)) {
 output=rbind(output,
              matrix(z[[i]],ncol=10,byrow=TRUE))
}

이것은 현재 코드와 동일해야하며 훨씬 빠릅니다.

output <- matrix(unlist(z), ncol = 10, byrow = TRUE)

내가 생각하는 당신이 원하는

output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))

의 BlueMagister의 사용 @ 결합 즉 do.call(rbind,...)lapply문은 11 * 10 행렬로 개별 목록 요소를 변환하는 ...

벤치 마크 (@flodel의 unlist솔루션이 내 것보다 5 배 빠르며 원래 접근 방식보다 230 배 빠릅니다 ...)

n <- 1000
z <- replicate(n,matrix(1:110,ncol=10,byrow=TRUE),simplify=FALSE)
library(rbenchmark)
origfn <- function(z) {
    output <- NULL 
    for(i in 1:length(z))
        output<- rbind(output,matrix(z[[i]],ncol=10,byrow=TRUE))
}
rbindfn <- function(z) do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))
unlistfn <- function(z) matrix(unlist(z), ncol = 10, byrow = TRUE)

##          test replications elapsed relative user.self sys.self 
## 1   origfn(z)          100  36.467  230.804    34.834    1.540  
## 2  rbindfn(z)          100   0.713    4.513     0.708    0.012 
## 3 unlistfn(z)          100   0.158    1.000     0.144    0.008 

이것이 적절하게 확장된다면 (즉, 메모리 문제가 발생하지 않는 경우), 전체 문제는 유사한 컴퓨터에서 약 130 * 0.2 초 = 26 초가 소요될 것입니다 (저는 2 년 된 MacBook Pro에서이 작업을 수행했습니다).


출력에 대한 샘플 정보가 있으면 도움이 될 것입니다. rbind더 크고 더 큰 것을 재귀 적으로 사용 하는 것은 권장되지 않습니다 . 도움이 될만한 첫 번째 추측 :

z <- list(1:3,4:6,7:9)
do.call(rbind,z)

필요한 경우 효율성을 높이려면 관련 질문참조하십시오 .


당신은 또한 사용할 수 있습니다,

output <- as.matrix(as.data.frame(z))

메모리 사용량은 다음과 매우 유사합니다.

output <- matrix(unlist(z), ncol = 10, byrow = TRUE)

mem_changed()에서 확인할 수 있습니다 library(pryr).


as.matrix를 아래와 같이 사용할 수 있습니다.

output <- as.matrix(z)

참고 URL : https://stackoverflow.com/questions/13224553/how-to-convert-a-huge-list-of-vector-to-a-matrix-more-efficiently

반응형