ํจํค์ง ์ ๋ฆฌ์ ๋ R ์ธ์ด์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ ํต์ฌ์ ํฌํจ๋์ด ์์ต๋๋ค. ๊น๋ํ.
ํจํค์ง์ ์ฃผ์ ๋ชฉ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ํ์์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์
๋๋ค.
์ด๋ฏธ Habrรฉ์์ ์ฌ์ฉ ๊ฐ๋ฅ
S.J.K.: Gather() ๋ฐ Spread()๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋์?
ํด๋ค๋ฆฌ ์์ปด: ์ด๋ ์ ๋. ์ฐ๋ฆฌ๋ ๋ ์ด์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์๊ณ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ํด๋น ๊ธฐ๋ฅ์ ํ์ฌ ์ํ๋ก ํจํค์ง์ ๊ณ์ ์กด์ฌํฉ๋๋ค.
๋ด์ฉ
๋ฐ์ดํฐ ๋ถ์์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ ๊ธ์๋ ๊ด์ฌ์ด ์์ผ์ค ๊ฒ๋๋ค.
๊น๋ํ ๋ฐ์ดํฐ ๊ฐ๋ tidyr ํจํค์ง์ ํฌํจ๋ ์ฃผ์ ๊ธฐ๋ฅ ๋ฐ์ดํฐ๋ฅผ ๋์ ํ์์์ ๊ธด ํ์์ผ๋ก ๋๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํ๋ ์๋ก์ด ๊ฐ๋ ์ต์ ๋ฒ์ ์ tidyr 0.8.3.9000 ์ค์น ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์ ํ ๋ฐ์ดํฐ๋ฅผ ์์ด๋ ํ์์์ ๊ธด ํ์์ผ๋ก ๋ณํํ๋ ๊ฐ๋จํ ์ ๋ช ์ธ์ ๋ค์ค ๊ฐ(.value)์ ์ฌ์ฉํ ์ง์ ๋ ์ง ํ๋ ์์ ๊ธด ํ์์์ ๋์ ํ์์ผ๋ก ๋ณํ ์๋ก์ด tidyr ๊ฐ๋ ์ ํ์ฉํ ๋ช ๊ฐ์ง ๊ณ ๊ธ ์ฌ๋ก ๊ฒฐ๋ก
๊น๋ํ ๋ฐ์ดํฐ ๊ฐ๋
๊ณจ ์ ๋ฆฌ์ ๋ โ ๋ฐ์ดํฐ๋ฅผ ์์ ๊น๋ํ ํ์์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊น๋ํ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ์ ๋๋ค.
- ๊ฐ ๋ณ์๋ ์ด์ ์์ต๋๋ค.
- ๊ฐ ๊ด์ธก๊ฐ์ ๋ฌธ์์ด์ ๋๋ค.
- ๊ฐ ๊ฐ์ ์ ์ ๋๋ค.
๋ถ์์ ์ํํ ๋, ๊น๋ํ ๋ฐ์ดํฐ๋ก ์ ์๋ ๋ฐ์ดํฐ๋ก ์์ ํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ๊ณ ํธ๋ฆฌํฉ๋๋ค.
tidyr ํจํค์ง์ ํฌํจ๋ ์ฃผ์ ๊ธฐ๋ฅ
tidyr์๋ ํ ์ด๋ธ์ ๋ณํํ๋๋ก ์ค๊ณ๋ ํจ์ ์ธํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
fill()
โ ์ด์ ๊ฐ์ผ๋ก ์ด์ ๋๋ฝ๋ ๊ฐ์ ์ฑ์๋๋ค.separate()
โ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ํ๋๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ๋ถํ ํฉ๋๋ค.unite()
โ ์ฌ๋ฌ ํ๋๋ฅผ ํ๋๋ก ๊ฒฐํฉํ๋ ์์ , ์ฆ ํจ์์ ๋ฐ๋ ๋์์ ์ํํฉ๋๋ค.separate()
;pivot_longer()
โ ๋ฐ์ดํฐ๋ฅผ ์์ด๋ ํ์์์ ๊ธด ํ์์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฅpivot_wider()
- ๋ฐ์ดํฐ๋ฅผ ๊ธด ํ์์์ ์์ด๋ ํ์์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํจ์๊ฐ ์ํํ ์์ ์ ์ญ๋์pivot_longer()
.gather()
์ธ๋ชจ์๋ โ ๋ฐ์ดํฐ๋ฅผ ์์ด๋ ํ์์์ ๊ธด ํ์์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฅspread()
์ธ๋ชจ์๋ - ๋ฐ์ดํฐ๋ฅผ ๊ธด ํ์์์ ์์ด๋ ํ์์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํจ์๊ฐ ์ํํ ์์ ์ ์ญ๋์gather()
.
๋ฐ์ดํฐ๋ฅผ ๋์ ํ์์์ ๊ธด ํ์์ผ๋ก ๋๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํ๋ ์๋ก์ด ๊ฐ๋
์ด์ ์๋ ์ด๋ฌํ ์ข
๋ฅ์ ๋ณํ์ ํจ์๊ฐ ์ฌ์ฉ๋์์ต๋๋ค. gather()
ะธ spread()
. ์๋
๋์ ์ด๋ฌํ ํจ์๊ฐ ์กด์ฌํ๋ฉด์ ํจํค์ง ์์ฑ์๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ ์ฌ์ฉ์์๊ฒ ์ด๋ฌํ ํจ์์ ์ด๋ฆ๊ณผ ํด๋น ์ธ์๊ฐ ๋ช
ํํ์ง ์์ ํด๋น ํจ์๋ฅผ ์ฐพ๊ณ ์ด๋ฌํ ํจ์ ์ค ์ด๋ค ํจ์๊ฐ ๋ณํํ๋์ง ์ดํดํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์๋ค๋ ๊ฒ์ด ๋ถ๋ช
ํด์ก์ต๋๋ค. ๋ ์ง ํ๋ ์์ ๋์ ํ์์์ ๊ธด ํ์์ผ๋ก, ๋๋ ๊ทธ ๋ฐ๋๋ก ๋ณ๊ฒฝํฉ๋๋ค.
์ด์ ๊ด๋ จํ์ฌ, ์ ๋ฆฌ์ ๋ ๋ ์ง ํ๋ ์์ ๋ณํํ๋๋ก ์ค๊ณ๋ ๋ ๊ฐ์ง ์๋กญ๊ณ ์ค์ํ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.
์๋ก์ด ๊ธฐ๋ฅ pivot_longer()
ะธ pivot_wider()
ํจํค์ง์ ์ผ๋ถ ๊ธฐ๋ฅ์์ ์๊ฐ์ ์ป์์ต๋๋ค. cdata, John Mount์ Nina Zumel์ด ์ ์ํ์ต๋๋ค.
์ต์ ๋ฒ์ ์ tidyr 0.8.3.9000 ์ค์น
์๋ก์ด ์ต์ ๋ฒ์ ์ ํจํค์ง๋ฅผ ์ค์นํ๋ ค๋ฉด ์ ๋ฆฌ์ ๋ 0.8.3.9000, ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ธ์.
devtools::install_github("tidyverse/tidyr")
์ด ๊ธ์ ์ฐ๋ ์์ ์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ GitHub์ ๊ฐ๋ฐ ๋ฒ์ ํจํค์ง์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์ ํ
์ฌ์ค, ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ด์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์กํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ต๋๋ค. ๋ ๋์ ์ดํด๋ฅผ ์ํด ์ด์ ๊ธฐ๋ฅ ๋ฌธ์์ ์๋ฅผ ๋ค์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋์ผํ ์์
์ด ์ํ๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค. pivot_*()
๊ธฐ๋ฅ.
์์ด๋ ํ์์ ๊ธด ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
์์ง ํจ์ ๋ฌธ์์ ์์ ์ฝ๋
# example
library(dplyr)
stocks <- data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
# old
stocks_gather <- stocks %>% gather(key = stock,
value = price,
-time)
# new
stocks_long <- stocks %>% pivot_longer(cols = -time,
names_to = "stock",
values_to = "price")
๊ธด ํ์์ ์์ด๋ ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
ํ์ฐ ํจ์ ๋ฌธ์์ ์์ ์ฝ๋
# old
stocks_spread <- stocks_gather %>% spread(key = stock,
value = price)
# new
stock_wide <- stocks_long %>% pivot_wider(names_from = "stock",
values_from = "price")
์๋ํ๋ฉด ์์ ์์
์์์ pivot_longer()
ะธ pivot_wider()
, ์๋ณธ ํ
์ด๋ธ์์ ์ฃผ์ ์ธ์์ ๋์ด๋ ์ด์ด ์์ต๋๋ค. ์ด๋ฆ_๋์ ะธ ๊ฐ_to ์ด๋ฆ์ ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํฉ๋๋ค.
์๋ก์ด ๊ฐ๋ ์ ์์ ์ผ๋ก ์ ํํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ์ฝ๊ฒ ํ์ ํ๋ ๋ฐ ๋์์ด ๋๋ ํ ์ ๋ฆฌ์ ๋.
์ ์์ ๋ฉ๋ชจ
์๋์ ๋ชจ๋ ํ ์คํธ๋ ์ ์ํ์ ๋๋ค. ์ฌ์ง์ด ๋ฌด๋ฃ ๋ฒ์ญ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
์ฝํ ๊ณต์ tidyverse ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์น์ฌ์ดํธ์์.
๋ฐ์ดํฐ๋ฅผ ์์ด๋ ํ์์์ ๊ธด ํ์์ผ๋ก ๋ณํํ๋ ๊ฐ๋จํ ์
pivot_longer ()
โ ์ด ์๋ฅผ ์ค์ด๊ณ ํ ์๋ฅผ ๋๋ ค ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ ๊ธธ๊ฒ ๋ง๋ญ๋๋ค.
๊ธฐ์ฌ์ ์ ์๋ ์์ ๋ฅผ ์คํํ๋ ค๋ฉด ๋จผ์ ํ์ํ ํจํค์ง๋ฅผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
library(tidyr)
library(dplyr)
library(readr)
์ฌ๋๋ค์๊ฒ ์ข ๊ต์ ์ฐ๊ฐ ์๋์ ๊ดํด ์ง๋ฌธํ ์ค๋ฌธ ์กฐ์ฌ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
#> # A tibble: 18 x 11
#> religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k`
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Agnostic 27 34 60 81 76 137
#> 2 Atheist 12 27 37 52 35 70
#> 3 Buddhist 27 21 30 34 33 58
#> 4 Catholic 418 617 732 670 638 1116
#> 5 Donโt kโฆ 15 14 15 11 10 35
#> 6 Evangelโฆ 575 869 1064 982 881 1486
#> 7 Hindu 1 9 7 9 11 34
#> 8 Historiโฆ 228 244 236 238 197 223
#> 9 Jehovahโฆ 20 27 24 24 21 30
#> 10 Jewish 19 19 25 25 30 95
#> # โฆ with 8 more rows, and 4 more variables: `$75-100k` <dbl>,
#> # `$100-150k` <dbl>, `>150k` <dbl>, `Don't know/refused` <dbl>
์ด ํ
์ด๋ธ์๋ ์๋ต์์ ์ข
๊ต ๋ฐ์ดํฐ๊ฐ ํ์ผ๋ก ํฌํจ๋์ด ์์ผ๋ฉฐ ์๋ ์์ค์ ์ด ์ด๋ฆ์ ๋ถ์ฐ๋์ด ์์ต๋๋ค. ๊ฐ ์นดํ
๊ณ ๋ฆฌ์ ์๋ต์ ์๋ ์ข
๊ต์ ์๋ ์์ค์ด ๊ต์ฐจํ๋ ์
๊ฐ์ ์ ์ฅ๋ฉ๋๋ค. ํ
์ด๋ธ์ ๊น๋ํ๊ณ ์ฌ๋ฐ๋ฅธ ํ์์ผ๋ก ๋ง๋ค๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. pivot_longer()
:
pew %>%
pivot_longer(cols = -religion, names_to = "income", values_to = "count")
pew %>%
pivot_longer(cols = -religion, names_to = "income", values_to = "count")
#> # A tibble: 180 x 3
#> religion income count
#> <chr> <chr> <dbl>
#> 1 Agnostic <$10k 27
#> 2 Agnostic $10-20k 34
#> 3 Agnostic $20-30k 60
#> 4 Agnostic $30-40k 81
#> 5 Agnostic $40-50k 76
#> 6 Agnostic $50-75k 137
#> 7 Agnostic $75-100k 122
#> 8 Agnostic $100-150k 109
#> 9 Agnostic >150k 84
#> 10 Agnostic Don't know/refused 96
#> # โฆ with 170 more rows
ํจ์ ์ธ์ pivot_longer()
- ์ฒซ ๋ฒ์งธ ์ธ์ ๋ชฉ๊ฑธ์ด, ๋ณํฉํด์ผ ํ ์ด์ ์ค๋ช ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ค์์ ์ ์ธํ ๋ชจ๋ ์ด์ ์๊ฐ.
- ๋ ผ์ ์ด๋ฆ_๋์ ์ฐ๋ฆฌ๊ฐ ์ฐ๊ฒฐํ ์ด์ ์ด๋ฆ์์ ์์ฑ๋ ๋ณ์์ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค.
- ๊ฐ_to ๋ณํฉ๋ ์ด์ ์ ๊ฐ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์์ ์์ฑ๋ ๋ณ์์ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค.
๋ช ์ธ์
์ด๊ฒ์ ํจํค์ง์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค. ์ ๋ฆฌ์ ๋, ์ด์ ์๋ ๋ ๊ฑฐ์ ๊ธฐ๋ฅ์ผ๋ก ์์ ํ ๋ ์ฌ์ฉํ ์ ์์์ต๋๋ค.
์ฌ์์ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก, ๊ฐ ํ์ ์ ์ถ๋ ฅ ๋ ์ง ํ๋ ์์ ํ ์ด๊ณผ ๋ค์์ผ๋ก ์์ํ๋ ๋ ๊ฐ์ ํน์ ์ด์ ํด๋นํฉ๋๋ค.
- .name์ ์๋ ์ด ์ด๋ฆ์ ํฌํจํฉ๋๋ค.
- .๊ฐ ์ ๊ฐ์ด ํฌํจ๋ ์ด์ ์ด๋ฆ์ ํฌํจํฉ๋๋ค.
์ฌ์์ ๋๋จธ์ง ์ด์ ์ ์ด์ด ์์ถ๋ ์ด์ ์ด๋ฆ์ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐ์ํฉ๋๋ค. .name์.
์ฌ์์ ์ด ์ด๋ฆ์ ์ ์ฅ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ๊ฐ ์ด์ ๋ํด ํ๋์ ํ๊ณผ ๊ฐ ๋ณ์์ ๋ํด ํ๋์ ์ด์ด ์ด ์ด๋ฆ๊ณผ ๊ฒฐํฉ๋ฉ๋๋ค. ์ด ์ ์๋ ํ์ฌ๋ก์๋ ํผ๋์ค๋ฌ์ ๋ณด์ผ ์ ์์ง๋ง ๋ช ๊ฐ์ง ์๋ฅผ ์ดํด๋ณด๋ฉด ํจ์ฌ ๋ ์ดํดํ๊ธฐ ์ฌ์์ง ๊ฒ์ ๋๋ค. ๋ ๋ช ํํด์ก์ต๋๋ค.
์ฌ์์ ์์ ์ ๋ณํ ์ค์ธ ๋ฐ์ดํฐ ํ๋ ์์ ๋ํ ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฒ์, ์์ ๋ฐ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
ํ
์ด๋ธ์ ์์ด๋ ํ์์์ ๊ธด ํ์์ผ๋ก ๋ณํํ ๋ ์ฌ์ ์์
์ ํ๋ ค๋ฉด ๋ค์ ํจ์๋ฅผ ์ฌ์ฉํ์ญ์์ค. pivot_longer_spec()
.
์ด ํจ์์ ์๋ ๋ฐฉ์์ ์์์ ์ค๋ช ํ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ๋ ์ง ํ๋ ์์ ๊ฐ์ ธ์ ํด๋น ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ํจํค์ง์ ํจ๊ป ์ ๊ณต๋๋ who ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ ๋ฆฌ์ ๋. ์ด ๋ฐ์ดํฐ ์ธํธ์๋ ๊ฒฐํต ๋ฐ๋ณ๋ฅ ์ ๋ํด ๊ตญ์ ๋ณด๊ฑด ๊ธฐ๊ตฌ์์ ์ ๊ณตํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
who
#> # A tibble: 7,240 x 60
#> country iso2 iso3 year new_sp_m014 new_sp_m1524 new_sp_m2534
#> <chr> <chr> <chr> <int> <int> <int> <int>
#> 1 Afghanโฆ AF AFG 1980 NA NA NA
#> 2 Afghanโฆ AF AFG 1981 NA NA NA
#> 3 Afghanโฆ AF AFG 1982 NA NA NA
#> 4 Afghanโฆ AF AFG 1983 NA NA NA
#> 5 Afghanโฆ AF AFG 1984 NA NA NA
#> 6 Afghanโฆ AF AFG 1985 NA NA NA
#> 7 Afghanโฆ AF AFG 1986 NA NA NA
#> 8 Afghanโฆ AF AFG 1987 NA NA NA
#> 9 Afghanโฆ AF AFG 1988 NA NA NA
#> 10 Afghanโฆ AF AFG 1989 NA NA NA
#> # โฆ with 7,230 more rows, and 53 more variables
์ฌ์์ ๊ตฌ์ถํด ๋ณด๊ฒ ์ต๋๋ค.
spec <- who %>%
pivot_longer_spec(new_sp_m014:newrel_f65, values_to = "count")
#> # A tibble: 56 x 3
#> .name .value name
#> <chr> <chr> <chr>
#> 1 new_sp_m014 count new_sp_m014
#> 2 new_sp_m1524 count new_sp_m1524
#> 3 new_sp_m2534 count new_sp_m2534
#> 4 new_sp_m3544 count new_sp_m3544
#> 5 new_sp_m4554 count new_sp_m4554
#> 6 new_sp_m5564 count new_sp_m5564
#> 7 new_sp_m65 count new_sp_m65
#> 8 new_sp_f014 count new_sp_f014
#> 9 new_sp_f1524 count new_sp_f1524
#> 10 new_sp_f2534 count new_sp_f2534
#> # โฆ with 46 more rows
๋ถ์ผ ๊ตญ๊ฐ, iso2, iso3 ์ด๋ฏธ ๋ณ์์ ๋๋ค. ์ฐ๋ฆฌ์ ์๋ฌด๋ ๋ค์๊ณผ ๊ฐ์ด ์ด์ ๋ค์ง๋ ๊ฒ์ ๋๋ค. new_sp_m014 ์ newrel_f65.
์ด๋ฌํ ์ด์ ์ด๋ฆ์๋ ๋ค์ ์ ๋ณด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- ์ ๋์ฌ
new_
์ด์ ์๋ก์ด ๊ฒฐํต ์ฌ๋ก์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์์ ๋ํ๋ด๋ฉฐ ํ์ฌ ๋ ์ง ํ๋ ์์๋ ์๋ก์ด ์ง๋ณ์ ๋ํ ์ ๋ณด๋ง ํฌํจ๋์ด ์์ผ๋ฏ๋ก ํ์ฌ ๋งฅ๋ฝ์์ ์ด ์ ๋์ฌ๋ ์ด๋ค ์๋ฏธ๋ ๊ฐ์ง ์์ต๋๋ค. sp
/rel
/sp
/ep
์ง๋ณ์ ์ง๋จํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.m
/f
ํ์์ ์ฑ๋ณ.014
/1524
/2535
/3544
/4554
/65
ํ์ ์ฐ๋ น๋.
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ด์ ๋ถํ ํ ์ ์์ต๋๋ค. extract()
์ ๊ท ํํ์์ ์ฌ์ฉํฉ๋๋ค.
spec <- spec %>%
extract(name, c("diagnosis", "gender", "age"), "new_?(.*)_(.)(.*)")
#> # A tibble: 56 x 5
#> .name .value diagnosis gender age
#> <chr> <chr> <chr> <chr> <chr>
#> 1 new_sp_m014 count sp m 014
#> 2 new_sp_m1524 count sp m 1524
#> 3 new_sp_m2534 count sp m 2534
#> 4 new_sp_m3544 count sp m 3544
#> 5 new_sp_m4554 count sp m 4554
#> 6 new_sp_m5564 count sp m 5564
#> 7 new_sp_m65 count sp m 65
#> 8 new_sp_f014 count sp f 014
#> 9 new_sp_f1524 count sp f 1524
#> 10 new_sp_f2534 count sp f 2534
#> # โฆ with 46 more rows
์นผ๋ผ์ ์ฐธ๊ณ ํด์ฃผ์ธ์ .name์ ์ด๋ ์๋ณธ ๋ฐ์ดํฐ ์ธํธ์ ์ด ์ด๋ฆ์ ๋ํ ์ธ๋ฑ์ค์ด๋ฏ๋ก ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค.
์ฑ๋ณ ๋ฐ ์ฐ๋ น(์ด ์ฑ๋ณ ะธ ๋์ด)์๋ ๊ณ ์ ๋ ๊ฐ๊ณผ ์๋ ค์ง ๊ฐ์ด ์์ผ๋ฏ๋ก ์ด๋ฌํ ์ด์ ์์ธ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
spec <- spec %>%
mutate(
gender = factor(gender, levels = c("f", "m")),
age = factor(age, levels = unique(age), ordered = TRUE)
)
๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ฌ์์ ์๋ ๋ ์ง ํ๋ ์์ ์ ์ฉํ๊ธฐ ์ํด ๋๊ตฌ ์ฐ๋ฆฌ๋ ์ธ์๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค ํฌ๊ธฐ ๊ธฐ๋ฅ์์ pivot_longer()
.
who %>% pivot_longer(spec = spec)
#> # A tibble: 405,440 x 8
#> country iso2 iso3 year diagnosis gender age count
#> <chr> <chr> <chr> <int> <chr> <fct> <ord> <int>
#> 1 Afghanistan AF AFG 1980 sp m 014 NA
#> 2 Afghanistan AF AFG 1980 sp m 1524 NA
#> 3 Afghanistan AF AFG 1980 sp m 2534 NA
#> 4 Afghanistan AF AFG 1980 sp m 3544 NA
#> 5 Afghanistan AF AFG 1980 sp m 4554 NA
#> 6 Afghanistan AF AFG 1980 sp m 5564 NA
#> 7 Afghanistan AF AFG 1980 sp m 65 NA
#> 8 Afghanistan AF AFG 1980 sp f 014 NA
#> 9 Afghanistan AF AFG 1980 sp f 1524 NA
#> 10 Afghanistan AF AFG 1980 sp f 2534 NA
#> # โฆ with 405,430 more rows
๋ฐฉ๊ธ ์ํํ ๋ชจ๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ต์ ์ผ๋ก ์ค๋ช ํ ์ ์์ต๋๋ค.
๋ค์ค ๊ฐ(.value)์ ์ฌ์ฉํ ์ง์
์์ ์์์ ์ฌ์ ์ด์ .๊ฐ ๊ฐ์ด ํ๋๋ง ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ํด๋น๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ก๋ ๊ฐ์ ๋ฐ์ดํฐ ์ ํ์ด ๋ค๋ฅธ ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์์งํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ ๊ฑฐ์ ๊ธฐ๋ฅ ์ฌ์ฉ spread()
์ด๊ฒ์ ๊ฝค ์ด๋ ค์ธ ๊ฒ์
๋๋ค.
์๋ ์๋ ๋ค์์์ ๊ฐ์ ธ์จ ๊ฒ์
๋๋ค.
ํ๋ จ ๋ฐ์ดํฐํ๋ ์์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
family <- tibble::tribble(
~family, ~dob_child1, ~dob_child2, ~gender_child1, ~gender_child2,
1L, "1998-11-26", "2000-01-29", 1L, 2L,
2L, "1996-06-22", NA, 2L, NA,
3L, "2002-07-11", "2004-04-05", 2L, 2L,
4L, "2004-10-10", "2009-08-27", 1L, 1L,
5L, "2000-12-05", "2005-02-28", 2L, 1L,
)
family <- family %>% mutate_at(vars(starts_with("dob")), parse_date)
#> # A tibble: 5 x 5
#> family dob_child1 dob_child2 gender_child1 gender_child2
#> <int> <date> <date> <int> <int>
#> 1 1 1998-11-26 2000-01-29 1 2
#> 2 2 1996-06-22 NA 2 NA
#> 3 3 2002-07-11 2004-04-05 2 2
#> 4 4 2004-10-10 2009-08-27 1 1
#> 5 5 2000-12-05 2005-02-28 2 1
์์ฑ๋ ๋ ์ง ํ๋ ์์๋ ๊ฐ ์ค์ ํ ๊ฐ์กฑ์ ์๋ ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ฐ์กฑ์๊ฒ๋ ํ๋ ๋ช ์ ์๋ ๊ฐ ์์ ์ ์์ต๋๋ค. ๊ฐ ์ด๋ฆฐ์ด์ ๋ํด ์๋ ์์ผ๊ณผ ์ฑ๋ณ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์ ๊ณต๋๋ฉฐ ๊ฐ ์ด๋ฆฐ์ด์ ๋ฐ์ดํฐ๋ ๋ณ๋์ ์ด์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ์๋ฌด๋ ๋ถ์์ ์ํด ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅธ ํ์์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค.
๊ฐ ์ด๋ฆฐ์ด์ ๋ํ ์ ๋ณด์๋ ์ฑ๋ณ๊ณผ ์๋
์์ผ(์ ๋์ฌ๊ฐ ๋ถ์ ์ด)์ด๋ผ๋ ๋ ๊ฐ์ง ๋ณ์๊ฐ ์์ต๋๋ค. ์ธ๋ก ์๋
์์ผ, ์ ๋์ฌ๊ฐ ์๋ ์ด ํฌํจ ์ฑ๋ณ ์์ด์ ์ฑ๋ณ์ ํฌํจํฉ๋๋ค). ์์๋๋ ๊ฒฐ๊ณผ๋ ๋ณ๋์ ์ด์ ํ์๋์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ด ๋ค์๊ณผ ๊ฐ์ ์ฌ์์ ์์ฑํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค. .value
๋ ๊ฐ์ง ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
spec <- family %>%
pivot_longer_spec(-family) %>%
separate(col = name, into = c(".value", "child"))%>%
mutate(child = parse_number(child))
#> # A tibble: 4 x 3
#> .name .value child
#> <chr> <chr> <dbl>
#> 1 dob_child1 dob 1
#> 2 dob_child2 dob 2
#> 3 gender_child1 gender 1
#> 4 gender_child2 gender 2
์ด์ ์ ์ฝ๋๊ฐ ์ํํ๋ ์์ ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
pivot_longer_spec(-family)
โ ํจ๋ฐ๋ฆฌ ์ด์ ์ ์ธํ ๋ชจ๋ ๊ธฐ์กด ์ด์ ์์ถํ๋ ์ฌ์์ ๋ง๋ญ๋๋ค.separate(col = name, into = c(".value", "child"))
- ์ด์ ๋ถํ .name์, ๋ฐ์ค์ ์ฌ์ฉํ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ ์ด์ ์ ๋ ฅํ๋ ์์ค ํ๋์ ์ด๋ฆ์ ํฌํจํฉ๋๋ค. .๊ฐ ะธ ์์ด.mutate(child = parse_number(child))
โ ํ๋ ๊ฐ ๋ณํ ์์ด ํ ์คํธ์์ ์ซ์ ๋ฐ์ดํฐ ์ ํ์ผ๋ก.
์ด์ ๊ฒฐ๊ณผ ์ฌ์์ ์๋ณธ ๋ฐ์ดํฐ ํ๋ ์์ ์ ์ฉํ๊ณ ํ ์ด๋ธ์ ์ํ๋ ํ์์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
family %>%
pivot_longer(spec = spec, na.rm = T)
#> # A tibble: 9 x 4
#> family child dob gender
#> <int> <dbl> <date> <int>
#> 1 1 1 1998-11-26 1
#> 2 1 2 2000-01-29 2
#> 3 2 1 1996-06-22 2
#> 4 3 1 2002-07-11 2
#> 5 3 2 2004-04-05 2
#> 6 4 1 2004-10-10 1
#> 7 4 2 2009-08-27 1
#> 8 5 1 2000-12-05 2
#> 9 5 2 2005-02-28 1
์ฐ๋ฆฌ๋ ๋
ผ์์ ์ฌ์ฉํฉ๋๋ค na.rm = TRUE
, ํ์ฌ ๋ฐ์ดํฐ ํ์์์๋ ์กด์ฌํ์ง ์๋ ๊ด์ธก๊ฐ์ ๋ํด ์ถ๊ฐ ํ์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ํ๋ฉด 2๋ฒ ๊ฐ์กฑ์๊ฒ๋ ์๋
๊ฐ ํ ๋ช
๋ฟ์ด๊ณ , na.rm = TRUE
๊ณ์ด 2๊ฐ ์ถ๋ ฅ์ ํ๋์ ํ์ ๊ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ ์ง ํ๋ ์์ ๊ธด ํ์์์ ๋์ ํ์์ผ๋ก ๋ณํ
pivot_wider()
-๋ ์ญ๋ณํ์ด๊ณ , ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ ํ ์๋ฅผ ์ค์ฌ ๋ ์ง ํ๋ ์์ ์ด ์๋ฅผ ๋๋ฆฝ๋๋ค.
์ด๋ฌํ ์ข ๋ฅ์ ๋ณํ์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ํ์์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ฐ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ง๋ง ์ด ๊ธฐ์ ์ ํ๋ ์ ํ ์ด์ ์ ์ฌ์ฉ๋๋ ํผ๋ฒ ํ ์ด๋ธ์ ๋ง๋ค๊ฑฐ๋ ๋ค๋ฅธ ๋๊ตฌ์ ํตํฉํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์ค์ ๋ก ๊ธฐ๋ฅ์ pivot_longer()
ะธ pivot_wider()
๋์นญ์ ์ด๋ฉฐ ์๋ก ๋ฐ๋๋๋ ๋์์ ์์ฑํฉ๋๋ค. ์ฆ: df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec)
ะธ df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec)
์๋ณธ df๋ฅผ ๋ฐํํฉ๋๋ค.
ํ ์ด๋ธ์ ์์ด๋ ํ์์ผ๋ก ๋ณํํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ์
๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด pivot_wider()
์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค ๋ฌผ๊ณ ๊ธฐ_๋ง๋จ, ์ด๋ ๋ค์ํ ์คํ
์ด์
์ด ๊ฐ์ ๋ฐ๋ผ ๋ฌผ๊ณ ๊ธฐ์ ์์ง์์ ๊ธฐ๋กํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
#> # A tibble: 114 x 3
#> fish station seen
#> <fct> <fct> <int>
#> 1 4842 Release 1
#> 2 4842 I80_1 1
#> 3 4842 Lisbon 1
#> 4 4842 Rstr 1
#> 5 4842 Base_TD 1
#> 6 4842 BCE 1
#> 7 4842 BCW 1
#> 8 4842 BCE2 1
#> 9 4842 BCW2 1
#> 10 4842 MAE 1
#> # โฆ with 104 more rows
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ๊ฐ ์ญ์ ๋ํ ์ ๋ณด๋ฅผ ๋ณ๋์ ์ด์ ํ์ํ๋ฉด ์ด ํ๊ฐ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์ฌ์ฉํ๊ธฐ ๋ ์ฌ์์ง๋๋ค.
fish_encounters %>% pivot_wider(names_from = station, values_from = seen)
fish_encounters %>% pivot_wider(names_from = station, values_from = seen)
#> # A tibble: 19 x 12
#> fish Release I80_1 Lisbon Rstr Base_TD BCE BCW BCE2 BCW2 MAE
#> <fct> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 4842 1 1 1 1 1 1 1 1 1 1
#> 2 4843 1 1 1 1 1 1 1 1 1 1
#> 3 4844 1 1 1 1 1 1 1 1 1 1
#> 4 4845 1 1 1 1 1 NA NA NA NA NA
#> 5 4847 1 1 1 NA NA NA NA NA NA NA
#> 6 4848 1 1 1 1 NA NA NA NA NA NA
#> 7 4849 1 1 NA NA NA NA NA NA NA NA
#> 8 4850 1 1 NA 1 1 1 1 NA NA NA
#> 9 4851 1 1 NA NA NA NA NA NA NA NA
#> 10 4854 1 1 NA NA NA NA NA NA NA NA
#> # โฆ with 9 more rows, and 1 more variable: MAW <int>
์ด ๋ฐ์ดํฐ ์ธํธ๋ ์คํ ์ด์ ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ฐ์งํ ๊ฒฝ์ฐ์๋ง ์ ๋ณด๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์ด๋ค ์คํ ์ด์ ์์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๊ธฐ๋ก๋์ง ์์ ๊ฒฝ์ฐ ์ด ๋ฐ์ดํฐ๋ ํ ์ด๋ธ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ด๋ ์ถ๋ ฅ์ด NA๋ก ์ฑ์์ง์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ ๊ธฐ๋ก์ด ์๋ค๋ ๊ฒ์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋ณด์ด์ง ์์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ_์ฑ์ฐ๊ธฐ ๊ธฐ๋ฅ์์ pivot_wider()
๋ค์ ๋๋ฝ๋ ๊ฐ์ 0์ผ๋ก ์ฑ์๋๋ค.
fish_encounters %>% pivot_wider(
names_from = station,
values_from = seen,
values_fill = list(seen = 0)
)
#> # A tibble: 19 x 12
#> fish Release I80_1 Lisbon Rstr Base_TD BCE BCW BCE2 BCW2 MAE
#> <fct> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 4842 1 1 1 1 1 1 1 1 1 1
#> 2 4843 1 1 1 1 1 1 1 1 1 1
#> 3 4844 1 1 1 1 1 1 1 1 1 1
#> 4 4845 1 1 1 1 1 0 0 0 0 0
#> 5 4847 1 1 1 0 0 0 0 0 0 0
#> 6 4848 1 1 1 1 0 0 0 0 0 0
#> 7 4849 1 1 0 0 0 0 0 0 0 0
#> 8 4850 1 1 0 1 1 1 1 0 0 0
#> 9 4851 1 1 0 0 0 0 0 0 0 0
#> 10 4854 1 1 0 0 0 0 0 0 0 0
#> # โฆ with 9 more rows, and 1 more variable: MAW <int>
์ฌ๋ฌ ์์ค ๋ณ์์์ ์ด ์ด๋ฆ ์์ฑ
์ ํ, ๊ตญ๊ฐ, ์ฐ๋์ ์กฐํฉ์ด ํฌํจ๋ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ํ ์คํธ ๋ ์ง ํ๋ ์์ ์์ฑํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค.
df <- expand_grid(
product = c("A", "B"),
country = c("AI", "EI"),
year = 2000:2014
) %>%
filter((product == "A" & country == "AI") | product == "B") %>%
mutate(value = rnorm(nrow(.)))
#> # A tibble: 45 x 4
#> product country year value
#> <chr> <chr> <int> <dbl>
#> 1 A AI 2000 -2.05
#> 2 A AI 2001 -0.676
#> 3 A AI 2002 1.60
#> 4 A AI 2003 -0.353
#> 5 A AI 2004 -0.00530
#> 6 A AI 2005 0.442
#> 7 A AI 2006 -0.610
#> 8 A AI 2007 -2.77
#> 9 A AI 2008 0.899
#> 10 A AI 2009 -0.106
#> # โฆ with 35 more rows
์ฐ๋ฆฌ์ ์๋ฌด๋ ํ๋์ ์ด์ ์ ํ๊ณผ ๊ตญ๊ฐ์ ๊ฐ ์กฐํฉ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋๋ก ๋ฐ์ดํฐ ํ๋ ์์ ํ์ฅํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ธ์๋ฅผ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฆ_์ถ์ฒ ๋ณํฉํ ํ๋์ ์ด๋ฆ์ ํฌํจํ๋ ๋ฒกํฐ์ ๋๋ค.
df %>% pivot_wider(names_from = c(product, country),
values_from = "value")
#> # A tibble: 15 x 4
#> year A_AI B_AI B_EI
#> <int> <dbl> <dbl> <dbl>
#> 1 2000 -2.05 0.607 1.20
#> 2 2001 -0.676 1.65 -0.114
#> 3 2002 1.60 -0.0245 0.501
#> 4 2003 -0.353 1.30 -0.459
#> 5 2004 -0.00530 0.921 -0.0589
#> 6 2005 0.442 -1.55 0.594
#> 7 2006 -0.610 0.380 -1.28
#> 8 2007 -2.77 0.830 0.637
#> 9 2008 0.899 0.0175 -1.30
#> 10 2009 -0.106 -0.195 1.03
#> # โฆ with 5 more rows
๊ธฐ๋ฅ์ ์ฌ์์ ์ ์ฉํ ์๋ ์์ต๋๋ค. pivot_wider()
. ํ์ง๋ง ์ ์ถํ ๋ pivot_wider()
์ฌ์์ ๋ฐ๋ ๋ณํ์ ์ํํฉ๋๋ค. pivot_longer()
: ๋ค์์ ์ง์ ๋ ์ด .name์, ๋ค์์ ๊ฐ์ ์ฌ์ฉํ์ฌ .๊ฐ ๋ฐ ๊ธฐํ ์ด.
์ด ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ์๋ ํญ๋ชฉ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฅํ ๋ชจ๋ ๊ตญ๊ฐ ๋ฐ ์ ํ ์กฐํฉ์ ์์ฒด ์ด์ด ์๋๋ก ํ๋ ค๋ฉด ์ฌ์ฉ์ ์ง์ ์ฌ์์ ์์ฑํ ์ ์์ต๋๋ค.
spec <- df %>%
expand(product, country, .value = "value") %>%
unite(".name", product, country, remove = FALSE)
#> # A tibble: 4 x 4
#> .name product country .value
#> <chr> <chr> <chr> <chr>
#> 1 A_AI A AI value
#> 2 A_EI A EI value
#> 3 B_AI B AI value
#> 4 B_EI B EI value
df %>% pivot_wider(spec = spec) %>% head()
#> # A tibble: 6 x 5
#> year A_AI A_EI B_AI B_EI
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 2000 -2.05 NA 0.607 1.20
#> 2 2001 -0.676 NA 1.65 -0.114
#> 3 2002 1.60 NA -0.0245 0.501
#> 4 2003 -0.353 NA 1.30 -0.459
#> 5 2004 -0.00530 NA 0.921 -0.0589
#> 6 2005 0.442 NA -1.55 0.594
์๋ก์ด tidyr ๊ฐ๋ ์ ํ์ฉํ ๋ช ๊ฐ์ง ๊ณ ๊ธ ์ฌ๋ก
๋ฏธ๊ตญ ์ธ๊ตฌ ์กฐ์ฌ ์๋ ๋ฐ ์๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์๋ก ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
๋ฐ์ดํฐ ์ธํธ us_rent_income 2017๋ ๋ฏธ๊ตญ ๋ชจ๋ ์ฃผ์ ์ค๊ฐ ์๋ ๋ฐ ์๋๋ฃ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค(๋ฐ์ดํฐ ์ธํธ๋ ํจํค์ง๋ก ์ ๊ณต๋จ). ๊น๋ํ ์ธ๊ตฌ ์กฐ์ฌ).
us_rent_income
#> # A tibble: 104 x 5
#> GEOID NAME variable estimate moe
#> <chr> <chr> <chr> <dbl> <dbl>
#> 1 01 Alabama income 24476 136
#> 2 01 Alabama rent 747 3
#> 3 02 Alaska income 32940 508
#> 4 02 Alaska rent 1200 13
#> 5 04 Arizona income 27517 148
#> 6 04 Arizona rent 972 4
#> 7 05 Arkansas income 23789 165
#> 8 05 Arkansas rent 709 5
#> 9 06 California income 29454 109
#> 10 06 California rent 1358 3
#> # โฆ with 94 more rows
๋ฐ์ดํฐ์ธํธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ํํ๋ก us_rent_income ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๋ ๊ฒ์ ๋งค์ฐ ๋ถํธํ๋ฏ๋ก ์ด์ด ์๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ฑํ๊ณ ์ถ์ต๋๋ค. ์๋, ์๋๋ฃ_๋ชจ, ์๋ค, ์๋_๋ชจ์. ์ด ์ฌ์์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง ์ค์ํ ์ ์ ๋ณ์ ๊ฐ๊ณผ ๋ณ์์ ๋ชจ๋ ์กฐํฉ์ ์์ฑํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ฒฌ์ /๋ชจ์๊ทธ๋ฐ ๋ค์ ์ด ์ด๋ฆ์ ์์ฑํฉ๋๋ค.
spec <- us_rent_income %>%
expand(variable, .value = c("estimate", "moe")) %>%
mutate(
.name = paste0(variable, ifelse(.value == "moe", "_moe", ""))
)
#> # A tibble: 4 x 3
#> variable .value .name
#> <chr> <chr> <chr>
#> 1 income estimate income
#> 2 income moe income_moe
#> 3 rent estimate rent
#> 4 rent moe rent_moe
์ด ์ฌ์์ ์ ๊ณต pivot_wider()
์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค:
us_rent_income %>% pivot_wider(spec = spec)
#> # A tibble: 52 x 6
#> GEOID NAME income income_moe rent rent_moe
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 01 Alabama 24476 136 747 3
#> 2 02 Alaska 32940 508 1200 13
#> 3 04 Arizona 27517 148 972 4
#> 4 05 Arkansas 23789 165 709 5
#> 5 06 California 29454 109 1358 3
#> 6 08 Colorado 32401 109 1125 5
#> 7 09 Connecticut 35326 195 1123 5
#> 8 10 Delaware 31560 247 1076 10
#> 9 11 District of Columbia 43198 681 1424 17
#> 10 12 Florida 25952 70 1077 3
#> # โฆ with 42 more rows
์ธ๊ณ ์ํ
๋๋ก๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ํ๋ ํ์์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ์ธํธ world_bank_pop 2000๋
๋ถํฐ 2018๋
๊น์ง ๊ฐ ๊ตญ๊ฐ์ ์ธ๊ตฌ์ ๋ํ ์ธ๊ณ์ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
#> # A tibble: 1,056 x 20
#> country indicator `2000` `2001` `2002` `2003` `2004` `2005` `2006`
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 ABW SP.URB.Tโฆ 4.24e4 4.30e4 4.37e4 4.42e4 4.47e+4 4.49e+4 4.49e+4
#> 2 ABW SP.URB.Gโฆ 1.18e0 1.41e0 1.43e0 1.31e0 9.51e-1 4.91e-1 -1.78e-2
#> 3 ABW SP.POP.Tโฆ 9.09e4 9.29e4 9.50e4 9.70e4 9.87e+4 1.00e+5 1.01e+5
#> 4 ABW SP.POP.Gโฆ 2.06e0 2.23e0 2.23e0 2.11e0 1.76e+0 1.30e+0 7.98e-1
#> 5 AFG SP.URB.Tโฆ 4.44e6 4.65e6 4.89e6 5.16e6 5.43e+6 5.69e+6 5.93e+6
#> 6 AFG SP.URB.Gโฆ 3.91e0 4.66e0 5.13e0 5.23e0 5.12e+0 4.77e+0 4.12e+0
#> 7 AFG SP.POP.Tโฆ 2.01e7 2.10e7 2.20e7 2.31e7 2.41e+7 2.51e+7 2.59e+7
#> 8 AFG SP.POP.Gโฆ 3.49e0 4.25e0 4.72e0 4.82e0 4.47e+0 3.87e+0 3.23e+0
#> 9 AGO SP.URB.Tโฆ 8.23e6 8.71e6 9.22e6 9.77e6 1.03e+7 1.09e+7 1.15e+7
#> 10 AGO SP.URB.Gโฆ 5.44e0 5.59e0 5.70e0 5.76e0 5.75e+0 5.69e+0 4.92e+0
#> # โฆ with 1,046 more rows, and 11 more variables: `2007` <dbl>,
#> # `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>, `2012` <dbl>,
#> # `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>
์ฐ๋ฆฌ์ ๋ชฉํ๋ ๊ฐ ๋ณ์๊ฐ ํด๋น ์ด์ ํฌํจ๋ ๊น๋ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ ํํ ์ด๋ค ๋จ๊ณ๊ฐ ํ์ํ์ง๋ ํ์คํ์ง ์์ง๋ง ๊ฐ์ฅ ๋ช ๋ฐฑํ ๋ฌธ์ ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ์ฐ๋๊ฐ ์ฌ๋ฌ ์ด์ ๊ฑธ์ณ ๋ถ์ฐ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. pivot_longer()
.
pop2 <- world_bank_pop %>%
pivot_longer(`2000`:`2017`, names_to = "year")
#> # A tibble: 19,008 x 4
#> country indicator year value
#> <chr> <chr> <chr> <dbl>
#> 1 ABW SP.URB.TOTL 2000 42444
#> 2 ABW SP.URB.TOTL 2001 43048
#> 3 ABW SP.URB.TOTL 2002 43670
#> 4 ABW SP.URB.TOTL 2003 44246
#> 5 ABW SP.URB.TOTL 2004 44669
#> 6 ABW SP.URB.TOTL 2005 44889
#> 7 ABW SP.URB.TOTL 2006 44881
#> 8 ABW SP.URB.TOTL 2007 44686
#> 9 ABW SP.URB.TOTL 2008 44375
#> 10 ABW SP.URB.TOTL 2009 44052
#> # โฆ with 18,998 more rows
๋ค์ ๋จ๊ณ๋ ํ์ ๋ณ์๋ฅผ ์ดํด๋ณด๋ ๊ฒ์
๋๋ค.
pop2 %>% count(indicator)
#> # A tibble: 4 x 2
#> indicator n
#> <chr> <int>
#> 1 SP.POP.GROW 4752
#> 2 SP.POP.TOTL 4752
#> 3 SP.URB.GROW 4752
#> 4 SP.URB.TOTL 4752
SP.POP.GROW๊ฐ ์ธ๊ตฌ ์ฆ๊ฐ์ธ ๊ฒฝ์ฐ SP.POP.TOTL์ ์ด ์ธ๊ตฌ์ด๊ณ SP.URB์ ๋๋ค. * ๋๊ฐ์ง๋ง ๋์ ์ง์ญ์๋ง ํด๋น๋ฉ๋๋ค. ์ด ๊ฐ์ ๋ฉด์ - ๋ฉด์ (์ ์ฒด ๋๋ ๋์)๊ณผ ์ค์ ๋ฐ์ดํฐ(์ธ๊ตฌ ๋๋ ์ฑ์ฅ)๊ฐ ํฌํจ๋ ๋ณ์์ ๋ ๊ฐ์ง ๋ณ์๋ก ๋๋์ด ๋ณด๊ฒ ์ต๋๋ค.
pop3 <- pop2 %>%
separate(indicator, c(NA, "area", "variable"))
#> # A tibble: 19,008 x 5
#> country area variable year value
#> <chr> <chr> <chr> <chr> <dbl>
#> 1 ABW URB TOTL 2000 42444
#> 2 ABW URB TOTL 2001 43048
#> 3 ABW URB TOTL 2002 43670
#> 4 ABW URB TOTL 2003 44246
#> 5 ABW URB TOTL 2004 44669
#> 6 ABW URB TOTL 2005 44889
#> 7 ABW URB TOTL 2006 44881
#> 8 ABW URB TOTL 2007 44686
#> 9 ABW URB TOTL 2008 44375
#> 10 ABW URB TOTL 2009 44052
#> # โฆ with 18,998 more rows
์ด์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ๋ณ์๋ฅผ ๋ ๊ฐ์ ์ด๋ก ๋๋๋ ๊ฒ์ ๋๋ค.
pop3 %>%
pivot_wider(names_from = variable, values_from = value)
#> # A tibble: 9,504 x 5
#> country area year TOTL GROW
#> <chr> <chr> <chr> <dbl> <dbl>
#> 1 ABW URB 2000 42444 1.18
#> 2 ABW URB 2001 43048 1.41
#> 3 ABW URB 2002 43670 1.43
#> 4 ABW URB 2003 44246 1.31
#> 5 ABW URB 2004 44669 0.951
#> 6 ABW URB 2005 44889 0.491
#> 7 ABW URB 2006 44881 -0.0178
#> 8 ABW URB 2007 44686 -0.435
#> 9 ABW URB 2008 44375 -0.698
#> 10 ABW URB 2009 44052 -0.731
#> # โฆ with 9,494 more rows
์ฐ๋ฝ์ฒ ๋ชฉ๋ก
๋ง์ง๋ง ์๋ฅผ ๋ค์ด, ์น์ฌ์ดํธ์์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ ์ฐ๋ฝ์ฒ ๋ชฉ๋ก์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
contacts <- tribble(
~field, ~value,
"name", "Jiena McLellan",
"company", "Toyota",
"name", "John Smith",
"company", "google",
"email", "[email protected]",
"name", "Huxley Ratcliffe"
)
์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์ฐ๋ฝ์ฒ์ ์ํ๋์ง ์๋ณํ๋ ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ชฉ๋ก์ ํ๋ก ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ๊ฐ ์ ์ฐ๋ฝ์ฒ์ ๋ฐ์ดํฐ๊ฐ "์ด๋ฆ"์ผ๋ก ์์ํ๋ค๋ ์ ์ ์ฐธ๊ณ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฏ๋ก ๊ณ ์ ์๋ณ์๋ฅผ ๋ง๋ค๊ณ ํ๋ ์ด์ "์ด๋ฆ" ๊ฐ์ด ํฌํจ๋ ๋๋ง๋ค ์ด๋ฅผ 1์ฉ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
contacts <- contacts %>%
mutate(
person_id = cumsum(field == "name")
)
contacts
#> # A tibble: 6 x 3
#> field value person_id
#> <chr> <chr> <int>
#> 1 name Jiena McLellan 1
#> 2 company Toyota 1
#> 3 name John Smith 2
#> 4 company google 2
#> 5 email [email protected] 2
#> 6 name Huxley Ratcliffe 3
์ด์ ๊ฐ ์ฐ๋ฝ์ฒ์ ๋ํ ๊ณ ์ ID๊ฐ ์์ผ๋ฏ๋ก ํ๋์ ๊ฐ์ ์ด๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
contacts %>%
pivot_wider(names_from = field, values_from = value)
#> # A tibble: 3 x 4
#> person_id name company email
#> <int> <chr> <chr> <chr>
#> 1 1 Jiena McLellan Toyota <NA>
#> 2 2 John Smith google [email protected]
#> 3 3 Huxley Ratcliffe <NA> <NA>
๊ฒฐ๋ก
๋ด ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ ์๋ก์ด ๊ฐ๋
์ด ์ ๋ฆฌ์ ๋ ๊ธฐ์กด ๊ธฐ๋ฅ๋ณด๋ค ํจ์ฌ ๋ ์ง๊ด์ ์ด๊ณ ๊ธฐ๋ฅ๋ฉด์์ ์๋ฑํฉ๋๋ค. spread()
ะธ gather()
. ์ด ๊ธฐ์ฌ๊ฐ ๊ทํ์ ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. pivot_longer()
ะธ pivot_wider()
.
์ถ์ฒ : habr.com