do.call()? {dplyr}의 rbind_list(), rbind_all()을 쓰세요

data.frame 객체가 여러개 있다면? 보통 리스트로 묶여 있는 경우에 do.call() 함수와 rbind() 함수를 써서 합쳐 줍니다.

a <- data.frame(x = 1:1000000)
b <- data.frame(x = 1:1000000)

이렇게 ,a, b 두 개가 100만개씩 있고, 이 둘을 합치려면

test.bind1 <- function(a,b) {
  x <- list(a,b)
  do.call(rbind,x)
}

> system.time(test.bind1(a,b))
 사용자  시스템 elapsed
   0.68    0.00    0.69

0.69 초 정도 걸립니다.
같은 일을
> library(dplyr)

test.bind2 <- function(a,b) {
  rbind_list(a,b)
}

해서

> system.time(test.bind2(a,b))
 사용자  시스템 elapsed
   0.01    0.00    0.01

0.01초가 걸립니다. 뭐 70배 정도 빨리 합쳤습니다...
mclapply()를 써서 데이터가 리스트로 반환된 경우에는(반환값을 data라 할 때)
> output <- rbind_all(data)

반환된 값은 data.frame 객체입니다.

댓글

이 블로그의 인기 게시물

Bradley-Terry Model: paired comparison models

xlwings tutorial - 데이터 계산하여 붙여 넣기

R에서 csv 파일 읽는 법