반응형
거대한 벡터 목록을 행렬로 더 효율적으로 변환하는 방법은 무엇입니까?
각 요소가 길이 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)
반응형
'IT TIP' 카테고리의 다른 글
함수에 매개 변수로 전달하지 않고 Spring에서 현재 사용자 로케일을 얻는 방법은 무엇입니까? (0) | 2020.12.14 |
---|---|
벡터의 값을 기반으로 데이터 프레임에서 행 선택 (0) | 2020.12.14 |
Xcode 예외 중단 점이 throw되는 예외의 세부 정보를 인쇄하지 않습니다. (0) | 2020.12.14 |
Ruby 버전은 2.0.0이지만 Gemfile은 2.1.0을 지정했습니다. (0) | 2020.12.14 |
Python : 하위 디렉토리의 모든 소스 파일에 대해 unittest.main ()을 실행하는 방법은 무엇입니까? (0) | 2020.12.14 |