nest(.data, ..., names_sep = NULL, .key = deprecated())
Today Function : nest
오늘의 함수는 tidyr 패키지의 nest()
함수입니다. nest()
함수는 데이터프레임을 중첩시킬 때 사용합니다.
중첩(nest)된 데이터프레임은 하나 이상의 열이 리스트인 데이터프레임을 의미합니다.
Usage
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]>
# 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()
를 이용해 중첩시키는 게 직관적입니다.
# 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]>