nest() : Create a list-column of data frames

데이터프레임을 중첩시킬 때
tidyr
Author

chichead

Published

October 2, 2022

Today Function : nest

오늘의 함수는 tidyr 패키지의 nest() 함수입니다.
nest() 함수는 데이터프레임을 중첩시킬 때 사용합니다.
중첩(nest)된 데이터프레임은 하나 이상의 열이 리스트인 데이터프레임을 의미합니다.


Usage

nest(.data, ..., names_sep = NULL, .key = deprecated())


Argument

.data : data.frame, tibble을 넣을 수 있습니다.
: 중첩될 칼럼을 입력합니다. tidy-select expression을 활용해 선택 가능합니다.
name_sep : 중첩될 칼럼의 이름을 정합니다. NULL(기본값)일 경우엔 기존 이름이 그래도 유지됩니다.
.key : 예전 버전의 nest 함수에서 사용한 영역(중첩될 칼럼의 이름 설정)으로 현재 문법에서는 사용하지 않습니다.


Example

library(tidyverse)

# tibble 함수를 통해 중첩된 tibble을 만들어보겠습니다.
# g와 data라는 2개의 열의 tibble이지만 data 열은 리스트의 형태입니다.
df1 <- tibble(
  g = c(1, 2, 3),
  data = list(
    tibble(x = 1, y = 2),
    tibble(x = 4:5, y = 6:7),
    tibble(x = 10)
  )
)

df1
# A tibble: 3 × 2
      g data            
  <dbl> <list>          
1     1 <tibble [1 × 2]>
2     2 <tibble [2 × 2]>
3     3 <tibble [1 × 1]>
# 이번엔 nest 함수를 통해 중첩된 tibble을 만들어보겠습니다.
df2 <- tribble(
  ~g, ~x, ~y,
   1,  1,  2,
   2,  4,  6,
   2,  5,  7,
   3, 10, NA
)

df2 |> nest(data = c(x, y))
# A tibble: 3 × 2
      g data            
  <dbl> <list>          
1     1 <tibble [1 × 2]>
2     2 <tibble [2 × 2]>
3     3 <tibble [1 × 2]>
# tidy-select argument를 이용해서 데이터를 선택할 수도 있습니다.
df2 |> nest(data = any_of(c("x", "y")))
# A tibble: 3 × 2
      g data            
  <dbl> <list>          
1     1 <tibble [1 × 2]>
2     2 <tibble [2 × 2]>
3     3 <tibble [1 × 2]>
df2 |> nest(data = !g)
# A tibble: 3 × 2
      g data            
  <dbl> <list>          
1     1 <tibble [1 × 2]>
2     2 <tibble [2 × 2]>
3     3 <tibble [1 × 2]>

nest() 함수에는 중첩될 변수를 지정합니다.
any_of(), starts_with() 등 tidy_select argument를 이용해서도 지정 가능합니다.
g를 기준으로 x와 y를 중첩하는 형태이기때문에 nest() 함수에 c(x, y)를 입력했습니다.


Grouped data frames

dplyr::group_by()를 이용하는 것도 방법입니다.
중첩될 변수를 지정하는 것보다 group_by()를 이용해 중첩시키는 게 직관적입니다.

library(dplyr)

df2 |> group_by(g) |> nest()
# A tibble: 3 × 2
# Groups:   g [3]
      g data            
  <dbl> <list>          
1     1 <tibble [1 × 2]>
2     2 <tibble [2 × 2]>
3     3 <tibble [1 × 2]>
# group_by + nest = group_nest
# dplyr 패키지의 group_nest는 tibble을 중첩할 때 두 과정을 한번에 처리합니다.
df2 |> group_nest(g)
# A tibble: 3 × 2
      g               data
  <dbl> <list<tibble[,2]>>
1     1            [1 × 2]
2     2            [2 × 2]
3     3            [1 × 2]
# 중첩된 데이터프레임을 만들어서 각각의 그룹에 따라 모델을 만들고, 예측 list도 생성할 수 있습니다.
mtcars_nested <- mtcars |>
  group_by(cyl) |>
  nest()

mtcars_nested
# A tibble: 3 × 2
# Groups:   cyl [3]
    cyl data              
  <dbl> <list>            
1     6 <tibble [7 × 10]> 
2     4 <tibble [11 × 10]>
3     8 <tibble [14 × 10]>
# lm 모델 생성
mtcars_nested <- mtcars_nested |>
  mutate(model = map(data, function(df) lm(mpg ~ wt, data = df)))

mtcars_nested
# A tibble: 3 × 3
# Groups:   cyl [3]
    cyl data               model 
  <dbl> <list>             <list>
1     6 <tibble [7 × 10]>  <lm>  
2     4 <tibble [11 × 10]> <lm>  
3     8 <tibble [14 × 10]> <lm>  
# 만들어진 모델을 통해 예측값을 계산해봅니다.
mtcars_nested <- mtcars_nested |>
  mutate(model = map(model, predict))

mtcars_nested
# A tibble: 3 × 3
# Groups:   cyl [3]
    cyl data               model     
  <dbl> <list>             <list>    
1     6 <tibble [7 × 10]>  <dbl [7]> 
2     4 <tibble [11 × 10]> <dbl [11]>
3     8 <tibble [14 × 10]> <dbl [14]>