Do.call()


데이터는 리스트 구조에 담겨져 있다.
이 데이터를 어떤 함수로 전달하고 싶지만 그 함수는 리스트를 인자로 받을 수 없는 구조이다.

해결책
1. 리스트를 벡터로 변환한다.
2. do.call함수로 리스트를 개별 인자들로 분해한 쓰려고 하는 함수에 적용 한다.

do.call(function, list)

예제 아래와 같이 중첩 리스트(nested list)일 경우에 데이터행렬로 변경하기가 골치아프게 된다.

> list <- list(col1 = list (1,2,3), col2 = list(3,4,5), col3 = list(6,7,8))
> list
$col1
$col1[[1]]
[1] 1

$col1[[2]]
[1] 2

$col1[[3]]
[1] 3


$col2
$col2[[1]]
[1] 3

$col2[[2]]
[1] 4

$col2[[3]]
[1] 5


$col3
$col3[[1]]
[1] 6

$col3[[2]]
[1] 7

$col3[[3]]
[1] 8

# cbind를 수행해도 원하는 않는 코드가 생성 된다.
> cbind(list)
     list  
col1 List,3
col2 List,3
col3 List,3


# data.frame()을 수행해도 이상한 결과이다.
> as.data.frame(list)
  col1.1 col1.2 col1.3 col2.3 col2.4 col2.5 col3.6 col3.7 col3.8
1      1      2      3      3      4      5      6      7      8

> unlist(list)
col11 col12 col13 col21 col22 col23 col31 col32 col33 
    1     2     3     3     4     5     6     7     8 

> cbind(unlist(list))
      [,1]
col11    1
col12    2
col13    3
col21    3
col22    4
col23    5
col31    6
col32    7
col33    8

#비로써 적절히 행과 열이 나뉘어서 합쳐지는 것을 볼 수 있다.
> do.call(cbind,list)
     col1 col2 col3
[1,] 1    3    6   
[2,] 2    4    7   
[3,] 3    5    8 


+ Recent posts