더북(TheBook)

리스트를 데이터 프레임으로 변환하기

lapply( )를 비롯한 많은 R 함수는 결과를 리스트로 반환한다. 리스트를 반환 값으로 채택한 이유 중 하나는 아마도 결과 값의 데이터 타입을 다양하게 설정할 수 있다는 점 때문일 것이다.

그러나 많은 데이터 모델링 또는 시각화 함수에서 인자로 데이터 프레임을 받는다. 또, 아무래도 데이터 프레임이 보기에 편하다. 이런 이유로 리스트를 데이터 프레임으로 변환할 필요가 종종 생기게 된다.

데이터 프레임을 함수 실행 결과로 얻는 가장 간단한 방법은 plyr의 ldply( ) 등과 같이 결과를 데이터 프레임으로 출력하는 함수를 사용하는 것이다. 하지만 안타깝게도 ldply( ) 함수의 속도는 llply( )와 같이 리스트를 결과로 출력하는 경우에 비해 좋지 않다. 다음은 plyr의 ldply( )와 llply( )의 성능을 비교한 예다. 1:10000의 x에 대해 val에 x, val2에 2 * x, val3에 2 / x, val4에 4 * x, val5에 4 / x를 지정하여 각각 데이터 프레임과 리스트로 변환했다.

> library(plyr)
> system.time(x <- ldply(1:10000, function(x) {
+   data.frame(val = x,
+               val2 = 2 * x,
+               val3 = 2 / x,
+               val4 = 4 * x,
+               val5 = 4 / x)
+ }))
  user system elapsed
  7.01   0.00    7.02

> system.time(x <- llply(1:10000, function(x) {
+   data.frame(val= x,
+               val2 = 2 * x,
+               val3 = 2 / x,
+               val4 = 4 * x,
+               val5 = 4 / x)
+ }))
      user system elapsed
      4.98   0.00    4.98

결과를 보면 같은 연산을 수행하는 코드임에도 불구하고, ldply( )의 실행 소요 시간elapsed이 llply( )의 1.4배에 가까운 것을 알 수 있다. 그 이유는 ldply( )는 llply( )를 사용해 리스트로 구성된 결과를 얻은 다음 이를 다시 데이터 프레임으로 변환하기 때문이다. 그리고 리스트를 데이터 프레임으로 만드는 데는 생각보다 긴 시간이 소요된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.