내용
데이터 변환
기본
library(nycflights13) library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ── ## ✔ ggplot2 3.4.0 ✔ purrr 0.3.5 ## ✔ tibble 3.1.8 ✔ dplyr 1.0.10 ## ✔ tidyr 1.2.1 ✔ stringr 1.4.1 ## ✔ readr 2.1.3 ✔ forcats 0.5.2
## Warning: 패키지 'ggplot2'는 R 버전 4.2.2에서 작성되었습니다
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── ## ✖ dplyr::filter() masks stats::filter() ## ✖ dplyr::lag() masks stats::lag()
library(rstatix)
## Warning: 패키지 'rstatix'는 R 버전 4.2.2에서 작성되었습니다
## ## 다음의 패키지를 부착합니다: 'rstatix' ## ## The following object is masked from 'package:stats': ## ## filter
flights 데이터 : tibble 구조로 처음 몇 행만을 출력합니다. 전체를 보기
위해서는 View(flignts)
를 실행
dplyr을 사용한 데이터 변환 기본 코드 형태는 다음과 같이 파이프라인을 사용하여 데이터를 함수에 전달하는 것입니다.
적용할 데이터는 flights에서 변수 month의 각 수준 별로 5개를 추출한
데이터 fly입니다. 이러한 추출을 위해 rstatix 라이브러리의
sample_n_by(data, grouping var, size)
를 사용합니다.
flights
## # A tibble: 336,776 × 19 ## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 1 1 517 515 2 830 819 11 UA ## 2 2013 1 1 533 529 4 850 830 20 UA ## 3 2013 1 1 542 540 2 923 850 33 AA ## 4 2013 1 1 544 545 -1 1004 1022 -18 B6 ## 5 2013 1 1 554 600 -6 812 837 -25 DL ## 6 2013 1 1 554 558 -4 740 728 12 UA ## 7 2013 1 1 555 600 -5 913 854 19 B6 ## 8 2013 1 1 557 600 -3 709 723 -14 EV ## 9 2013 1 1 557 600 -3 838 846 -8 B6 ## 10 2013 1 1 558 600 -2 753 745 8 AA ## # … with 336,766 more rows, 9 more variables: flight <int>, tailnum <chr>, ## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, ## # minute <dbl>, time_hour <dttm>, and abbreviated variable names ## # ¹sched_dep_time, ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
fly<-flights %>% sample_n_by(month, size=10) fly
## # A tibble: 120 × 19 ## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 1 17 1215 1221 -6 1521 1555 -34 UA ## 2 2013 1 30 844 805 39 1018 915 63 EV ## 3 2013 1 17 2106 2038 28 2155 2139 16 EV ## 4 2013 1 28 655 700 -5 800 807 -7 US ## 5 2013 1 25 2104 2100 4 2254 2225 29 WN ## 6 2013 1 27 2001 2000 1 2234 2305 -31 B6 ## 7 2013 1 30 1807 1758 9 1936 1936 0 UA ## 8 2013 1 29 1250 1250 0 1518 1520 -2 WN ## 9 2013 1 26 1051 1000 51 1323 1251 32 UA ## 10 2013 1 13 1803 1810 -7 2034 2037 -3 9E ## # … with 110 more rows, 9 more variables: flight <int>, tailnum <chr>, ## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, ## # minute <dbl>, time_hour <dttm>, and abbreviated variable names ## # ¹sched_dep_time, ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
함수에 적용할 데이터를 전달하기 위해 파이프 ’%>%’을 사용합니다. “%>%”는 파이프라인을 위한 코딩 기호로 ctrl+Shift+M으로 입력됩니다.
행에 영향을 주는 함수
filter(dataframe, 조건)
함수는 열들을 기준으로 행을 선택
fly %>% filter(arr_delay >120)
## # A tibble: 2 × 19 ## year month day dep_time sched_dep…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 6 2 2236 1940 176 16 2130 166 MQ ## 2 2013 10 7 2142 1815 207 2306 2015 171 WN ## # … with 9 more variables: flight <int>, tailnum <chr>, origin <chr>, ## # dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, ## # time_hour <dttm>, and abbreviated variable names ¹sched_dep_time, ## # ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
“&(and)”, “|(or)”을 사용하여 여러 조건을 조합할 수 있습니다.
fly%>%filter(month==1 & day==1)
## # A tibble: 0 × 19 ## # … with 19 variables: year <int>, month <int>, day <int>, dep_time <int>, ## # sched_dep_time <int>, dep_delay <dbl>, arr_time <int>, ## # sched_arr_time <int>, arr_delay <dbl>, carrier <chr>, flight <int>, ## # tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, ## # hour <dbl>, minute <dbl>, time_hour <dttm>
fly%>%filter(month==1 | month==2)
## # A tibble: 20 × 19 ## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 1 17 1215 1221 -6 1521 1555 -34 UA ## 2 2013 1 30 844 805 39 1018 915 63 EV ## 3 2013 1 17 2106 2038 28 2155 2139 16 EV ## 4 2013 1 28 655 700 -5 800 807 -7 US ## 5 2013 1 25 2104 2100 4 2254 2225 29 WN ## 6 2013 1 27 2001 2000 1 2234 2305 -31 B6 ## 7 2013 1 30 1807 1758 9 1936 1936 0 UA ## 8 2013 1 29 1250 1250 0 1518 1520 -2 WN ## 9 2013 1 26 1051 1000 51 1323 1251 32 UA ## 10 2013 1 13 1803 1810 -7 2034 2037 -3 9E ## 11 2013 2 28 905 910 -5 1016 1032 -16 B6 ## 12 2013 2 24 1914 1920 -6 2237 2246 -9 DL ## 13 2013 2 8 NA 1705 NA NA 1905 NA WN ## 14 2013 2 24 1904 1905 -1 2159 2217 -18 UA ## 15 2013 2 12 1821 1720 61 2117 2033 44 DL ## 16 2013 2 28 1154 1200 -6 1253 1309 -16 US ## 17 2013 2 19 1813 1810 3 2129 2130 -1 AA ## 18 2013 2 27 855 859 -4 1149 1145 4 DL ## 19 2013 2 25 851 859 -8 1119 1119 0 EV ## 20 2013 2 1 1255 1259 -4 1453 1456 -3 US ## # … with 9 more variables: flight <int>, tailnum <chr>, origin <chr>, ## # dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, ## # time_hour <dttm>, and abbreviated variable names ¹sched_dep_time, ## # ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
‘|’와’==‘를 조합하는 경우 연산자’%in%’을 사용할 수 있습니다.
fly %>% filter(month %in% c(1,2))
## # A tibble: 20 × 19 ## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 1 17 1215 1221 -6 1521 1555 -34 UA ## 2 2013 1 30 844 805 39 1018 915 63 EV ## 3 2013 1 17 2106 2038 28 2155 2139 16 EV ## 4 2013 1 28 655 700 -5 800 807 -7 US ## 5 2013 1 25 2104 2100 4 2254 2225 29 WN ## 6 2013 1 27 2001 2000 1 2234 2305 -31 B6 ## 7 2013 1 30 1807 1758 9 1936 1936 0 UA ## 8 2013 1 29 1250 1250 0 1518 1520 -2 WN ## 9 2013 1 26 1051 1000 51 1323 1251 32 UA ## 10 2013 1 13 1803 1810 -7 2034 2037 -3 9E ## 11 2013 2 28 905 910 -5 1016 1032 -16 B6 ## 12 2013 2 24 1914 1920 -6 2237 2246 -9 DL ## 13 2013 2 8 NA 1705 NA NA 1905 NA WN ## 14 2013 2 24 1904 1905 -1 2159 2217 -18 UA ## 15 2013 2 12 1821 1720 61 2117 2033 44 DL ## 16 2013 2 28 1154 1200 -6 1253 1309 -16 US ## 17 2013 2 19 1813 1810 3 2129 2130 -1 AA ## 18 2013 2 27 855 859 -4 1149 1145 4 DL ## 19 2013 2 25 851 859 -8 1119 1119 0 EV ## 20 2013 2 1 1255 1259 -4 1453 1456 -3 US ## # … with 9 more variables: flight <int>, tailnum <chr>, origin <chr>, ## # dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, ## # time_hour <dttm>, and abbreviated variable names ¹sched_dep_time, ## # ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
arrange(dataframe, colnames)
는 인자로 전달한 열의 값들에
따라 올림차순으로 정렬합니다. desc()
를 함께 사용하여
내림차순으로 정렬할 수 있습니다.
fly %>% arrange(year, month, day, dep_time)
## # A tibble: 120 × 19 ## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 1 13 1803 1810 -7 2034 2037 -3 9E ## 2 2013 1 17 1215 1221 -6 1521 1555 -34 UA ## 3 2013 1 17 2106 2038 28 2155 2139 16 EV ## 4 2013 1 25 2104 2100 4 2254 2225 29 WN ## 5 2013 1 26 1051 1000 51 1323 1251 32 UA ## 6 2013 1 27 2001 2000 1 2234 2305 -31 B6 ## 7 2013 1 28 655 700 -5 800 807 -7 US ## 8 2013 1 29 1250 1250 0 1518 1520 -2 WN ## 9 2013 1 30 844 805 39 1018 915 63 EV ## 10 2013 1 30 1807 1758 9 1936 1936 0 UA ## # … with 110 more rows, 9 more variables: flight <int>, tailnum <chr>, ## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, ## # minute <dbl>, time_hour <dttm>, and abbreviated variable names ## # ¹sched_dep_time, ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
fly %>% arrange(dec(dep_dekay))
두 함수를 조합하여 사용할 수 있습니다. 다음은 dep_delay가 [-10, 10]인 상태에서 arr_delay에 대해 올림차순으로 정렬한 예입니다.
fly%>%filter(dep_delay <= 10 & dep_delay>=-10) %>% arrange(arr_delay)
## # A tibble: 90 × 19 ## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 3 9 1857 1900 -3 2146 2236 -50 DL ## 2 2013 9 9 1929 1930 -1 2150 2234 -44 UA ## 3 2013 10 11 1658 1700 -2 1816 1855 -39 AA ## 4 2013 11 3 1240 1245 -5 1516 1555 -39 WN ## 5 2013 5 15 1120 1125 -5 1352 1427 -35 UA ## 6 2013 1 17 1215 1221 -6 1521 1555 -34 UA ## 7 2013 5 20 1600 1600 0 1841 1915 -34 DL ## 8 2013 3 15 1050 1050 0 1329 1402 -33 DL ## 9 2013 1 27 2001 2000 1 2234 2305 -31 B6 ## 10 2013 4 7 728 729 -1 1011 1039 -28 UA ## # … with 80 more rows, 9 more variables: flight <int>, tailnum <chr>, ## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, ## # minute <dbl>, time_hour <dttm>, and abbreviated variable names ## # ¹sched_dep_time, ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
열에 영향을 주는 함수
- mutate(), select(), renames(), relocate() 는 현재 변수들의 함수관계를 이용하여 새로운 변수들을 생성합니다.
- select(), rename(), relocate()은 변수이름과 위치를 변화시킵니다.
mutate(data, …)
은 열들 사이의 연산 또는 함수에 의한 결과를
새로운 변수로 추가합니다. 추가된 열은 오른쪽 끝에 위치하는 것이 기본이며
.before와 .after인수에 의해 그 위치를 지정할 수 있습니다.
두 인수에서 ’.’는 함수의 인수라는 것을 의미합니다.
trans1<-fly %>% mutate(gain=dep_delay-arr_delay, speed=distance/air_time*60) colnames(trans1)
## [1] "year" "month" "day" "dep_time" ## [5] "sched_dep_time" "dep_delay" "arr_time" "sched_arr_time" ## [9] "arr_delay" "carrier" "flight" "tailnum" ## [13] "origin" "dest" "air_time" "distance" ## [17] "hour" "minute" "time_hour" "gain" ## [21] "speed"
.before를 사용하여 위치를 지정합니다. 다음 코드와 같이 .before의 인수는 인덱스(정수)로 전달하지만 열이름을 직접 입력할 수 있습니다.
trans1<-fly %>% mutate(gain=dep_delay-arr_delay, speed=distance/air_time*60, .before=1) colnames(trans1)
## [1] "gain" "speed" "year" "month" ## [5] "day" "dep_time" "sched_dep_time" "dep_delay" ## [9] "arr_time" "sched_arr_time" "arr_delay" "carrier" ## [13] "flight" "tailnum" "origin" "dest" ## [17] "air_time" "distance" "hour" "minute" ## [21] "time_hour"
이 함수의 인수 .keep에 의해 출력되는 데이터의 열을 조정할 수 있습니다.
- all: 모든 열을 출력
- used: 함수에 사용된 열만 출력
- unused: 함수에 사용되지 않은 열만 출력
- none: 추가 열을 유지하지 않습니다.
trans1<-fly %>% mutate(gain=dep_delay-arr_delay, speed=distance/air_time*60, .before=1, .keep="used") colnames(trans1)
## [1] "gain" "speed" "dep_delay" "arr_delay" "air_time" "distance"
select()
지정한 열만을 선택합니다.
fly %>% select(year, month, day)
## # A tibble: 120 × 3 ## year month day ## <int> <int> <int> ## 1 2013 1 17 ## 2 2013 1 30 ## 3 2013 1 17 ## 4 2013 1 28 ## 5 2013 1 25 ## 6 2013 1 27 ## 7 2013 1 30 ## 8 2013 1 29 ## 9 2013 1 26 ## 10 2013 1 13 ## # … with 110 more rows
위 코드의 인수는 ’year:day’와 같이 나타낼 수 있습니다. 즉, 인수의 전달은 인덱스 형식으로 나타낼 수 있습니다. 또한 다음의 함수들을 slect()의 인수로 전달하여 사용할 수 있습니다.
- starts_with(‘abc’): ’abc’로 시작하는 이름
- ends_with(‘xyz’):’xyz’으로 끝나는 이름
- contains(‘ijk’):’ijk’를 포함하는 이름
- num_range(“x”, 1:3):x1, x2, x3
fly %>% select(ends_with("time"))
## # A tibble: 120 × 5 ## dep_time sched_dep_time arr_time sched_arr_time air_time ## <int> <int> <int> <int> <dbl> ## 1 1215 1221 1521 1555 348 ## 2 844 805 1018 915 39 ## 3 2106 2038 2155 2139 30 ## 4 655 700 800 807 46 ## 5 2104 2100 2254 2225 115 ## 6 2001 2000 2234 2305 139 ## 7 1807 1758 1936 1936 120 ## 8 1250 1250 1518 1520 250 ## 9 1051 1000 1323 1251 253 ## 10 1803 1810 2034 2037 157 ## # … with 110 more rows
열이름을 변환하기 위해서는 “새이름 = 기존 이름” 연산자를 사용합니다.
fly %>% select(tail_num=tailnum)
## # A tibble: 120 × 1 ## tail_num ## <chr> ## 1 N808UA ## 2 N16918 ## 3 N16976 ## 4 N767UW ## 5 N222WN ## 6 N659JB ## 7 N17719 ## 8 N432WN ## 9 N39728 ## 10 N602LR ## # … with 110 more rows
위 코드는 fly에서 tailnum변수를 추출하여 이름을 tail_num으로 변환한
것입니다. 즉, 새로운 객체를 생성한 것입니다. 그러나 기존 객체에 특정한
이름만을 변형하기 위해서는 rename(새이름 = 기존 이름)
함수를 사용합니다.
trans<-fly %>% rename(tail_num = tailnum) colnames(trans)
## [1] "year" "month" "day" "dep_time" ## [5] "sched_dep_time" "dep_delay" "arr_time" "sched_arr_time" ## [9] "arr_delay" "carrier" "flight" "tail_num" ## [13] "origin" "dest" "air_time" "distance" ## [17] "hour" "minute" "time_hour"
relocate()
함수는 데이터의 열 위치를 새롭게 지정하기 위해
사용합니다. 이 함수에 전달한 열이름은 기본적으로 첫번째 열부터
위치합니다. 위치를 지정하기 위해서는 .before, .after 인수를
사용합니다.
fly%>%relocate(time_hour)%>% colnames()
## [1] "time_hour" "year" "month" "day" ## [5] "dep_time" "sched_dep_time" "dep_delay" "arr_time" ## [9] "sched_arr_time" "arr_delay" "carrier" "flight" ## [13] "tailnum" "origin" "dest" "air_time" ## [17] "distance" "hour" "minute"
colnames(fly)
## [1] "year" "month" "day" "dep_time" ## [5] "sched_dep_time" "dep_delay" "arr_time" "sched_arr_time" ## [9] "arr_delay" "carrier" "flight" "tailnum" ## [13] "origin" "dest" "air_time" "distance" ## [17] "hour" "minute" "time_hour"
flights%>%relocate(c(time_hour, carrier),.after = day) %>% colnames()
## [1] "year" "month" "day" "time_hour" ## [5] "carrier" "dep_time" "sched_dep_time" "dep_delay" ## [9] "arr_time" "sched_arr_time" "arr_delay" "flight" ## [13] "tailnum" "origin" "dest" "air_time" ## [17] "distance" "hour" "minute"
위에서 소개한 starts_with()등의 함수를 적용할 수 있습니다.
fly%>%relocate(ends_with('time'))%>%colnames()
## [1] "dep_time" "sched_dep_time" "arr_time" "sched_arr_time" ## [5] "air_time" "year" "month" "day" ## [9] "dep_delay" "arr_delay" "carrier" "flight" ## [13] "tailnum" "origin" "dest" "distance" ## [17] "hour" "minute" "time_hour"
그룹화 함수
group_by()
함수는 인수로 전달한 변수이름의 각 수준별로 모든
데이터를 구분합니다. 다음은 변수 month에 의해 그룹화한 것입니다.
trans<-group_by(fly, month) unique(trans["month"])
## # A tibble: 12 × 1 ## # Groups: month [12] ## month ## <int> ## 1 1 ## 2 2 ## 3 3 ## 4 4 ## 5 5 ## 6 6 ## 7 7 ## 8 8 ## 9 9 ## 10 10 ## 11 11 ## 12 12
위와 같이 그룹화한 데이터에서 ’dep_delay’의 평균값을 반환합니다.
fly%>%group_by(month) %>% summarise(delay=mean(dep_delay))
## # A tibble: 12 × 2 ## month delay ## <int> <dbl> ## 1 1 11.4 ## 2 2 NA ## 3 3 0.6 ## 4 4 NA ## 5 5 2 ## 6 6 19.4 ## 7 7 26.4 ## 8 8 NA ## 9 9 NA ## 10 10 20.1 ## 11 11 2.2 ## 12 12 -2.5
위 결과와 같이 결측값이 반환하는 경우 데이터 자체의 결측값을 제거하기 위한 옵션을 선택합니다.
fly%>%group_by(month) %>% summarise(delay=mean(dep_delay, na.rm=TRUE), n=n())
## # A tibble: 12 × 3 ## month delay n ## <int> <dbl> <int> ## 1 1 11.4 10 ## 2 2 3.33 10 ## 3 3 0.6 10 ## 4 4 14.7 10 ## 5 5 2 10 ## 6 6 19.4 10 ## 7 7 26.4 10 ## 8 8 5.67 10 ## 9 9 -1.11 10 ## 10 10 20.1 10 ## 11 11 2.2 10 ## 12 12 -2.5 10
summarise()함수에 적용되는 함수로 n()는 데이터 갯수를 반환합니다.
빈도수를 반환하는 count()
는
group_by()+summarise(n=n())
와 같습니다.
daily<-fly%>%group_by(year, month, day) daily
## # A tibble: 120 × 19 ## # Groups: year, month, day [100] ## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier ## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> ## 1 2013 1 17 1215 1221 -6 1521 1555 -34 UA ## 2 2013 1 30 844 805 39 1018 915 63 EV ## 3 2013 1 17 2106 2038 28 2155 2139 16 EV ## 4 2013 1 28 655 700 -5 800 807 -7 US ## 5 2013 1 25 2104 2100 4 2254 2225 29 WN ## 6 2013 1 27 2001 2000 1 2234 2305 -31 B6 ## 7 2013 1 30 1807 1758 9 1936 1936 0 UA ## 8 2013 1 29 1250 1250 0 1518 1520 -2 WN ## 9 2013 1 26 1051 1000 51 1323 1251 32 UA ## 10 2013 1 13 1803 1810 -7 2034 2037 -3 9E ## # … with 110 more rows, 9 more variables: flight <int>, tailnum <chr>, ## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, ## # minute <dbl>, time_hour <dttm>, and abbreviated variable names ## # ¹sched_dep_time, ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
daily%>%summarise(n=n())
## `summarise()` has grouped output by 'year', 'month'. You can override using the ## `.groups` argument.
## # A tibble: 100 × 4 ## # Groups: year, month [12] ## year month day n ## <int> <int> <int> <int> ## 1 2013 1 13 1 ## 2 2013 1 17 2 ## 3 2013 1 25 1 ## 4 2013 1 26 1 ## 5 2013 1 27 1 ## 6 2013 1 28 1 ## 7 2013 1 29 1 ## 8 2013 1 30 2 ## 9 2013 2 1 1 ## 10 2013 2 8 1 ## # … with 90 more rows
그룹화된 데이터를 원 상태로 환원하기 위해 ungroup()
를
사용합니다. 즉 모든 데이터는 하나의 그룹이므로 결과는 다음과 같습니다.
daily %>% ungroup()%>% summarise(delay=mean(dep_delay, na.rm=TRUE), flight=n())
## # A tibble: 1 × 2 ## delay flight ## <dbl> <int> ## 1 8.61 120
피봇팅(Pivotting)
데이터의 배열이 다음과 같을 경우 피봇을 사용하여 정렬할 수 있습니다.
- 하나의 변수가 여러 열에 분산되어 있음
- 하나의 관측값이 여러 행에 흩어져 있음
이 경우 pivot_longer(), pivot_wider()
를 사용합니다.
pivot_longer()
tidyverse 라이브러리의 데이터 table4a는 두열이 모두 년도로 구성되어 있습니다.
table4a
# A tibble: 3 × 3 country `1999` `2000` * <chr> <int> <int> 1 Afghanistan 745 2666 2 Brazil 37737 80488 3 China 212258 213766
위 '1999', '2000'은 하나의 열로 결합하고 각각의 값을 다른 열로 구조를 변경합니다. 이를 위해 pivot_longer(결합할 열들, 열이름, 값들이 위치할 열이름)
함수를 사용합니다.
t4a<-table4a |> + pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases") t4a
# A tibble: 6 × 3 country year cases <chr> <chr> <int> 1 Afghanistan 1999 745 2 Afghanistan 2000 2666 3 Brazil 1999 37737 4 Brazil 2000 80488 5 China 1999 212258 6 China 2000 213766
위 결과 year의 값들은 열이름으로 부터 이동된 것으로 문자형입니다. 이를 숫자형으로 변환하기 위해 mutate()
를 사용할 수 있습니다.
mutate(t4a, year=parse_integer(year))
# A tibble: 6 × 3 country year cases <chr> <int> <int> 1 Afghanistan 1999 745 2 Afghanistan 2000 2666 3 Brazil 1999 37737 4 Brazil 2000 80488 5 China 1999 212258 6 China 2000 213766
데이터 table4b는 table4a와 같은 구성이지만 각 샘플에 반영된 값은 다른 객체입니다. 이를 year 열, case1, case2로 결합합니다. dplyr::keft_join()
함수를 적용합니다.
t4a<-table4a |> + pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases1") |> mutate(year=parse_integer(year)) t4b<-table4b |> + pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases2") |> mutate(year=parse_integer(year)) left_join(t4a, t4b)
Joining, by = c("country", "year") # A tibble: 6 × 4 country year cases1 cases2 <chr> <int> <int> <int> 1 Afghanistan 1999 745 19987071 2 Afghanistan 2000 2666 20595360 3 Brazil 1999 37737 172006362 4 Brazil 2000 80488 174504898 5 China 1999 212258 1272915272 6 China 2000 213766 1280428583
pivot_wider()
함수 pivot_wider()
는 관측값이 여러 행에 분포되어 있을 경우 동일한 관측값들을 하나의 열로 취합하기 위해 사용합니다. 데이터 table2는 이러한 구조입니다.
table2
# A tibble: 12 × 4 country year type count <chr> <int> <chr> <int> 1 Afghanistan 1999 cases 745 2 Afghanistan 1999 population 19987071 3 Afghanistan 2000 cases 2666 4 Afghanistan 2000 population 20595360 5 Brazil 1999 cases 37737 6 Brazil 1999 population 172006362 7 Brazil 2000 cases 80488 8 Brazil 2000 population 174504898 9 China 1999 cases 212258 10 China 1999 population 1272915272 11 China 2000 cases 213766 12 China 2000 population 1280428583
위 데이터의 type은 cases와 population이 혼합되어 있으며 이들을 변수(열)로 분리하여 나타냅니다.
t2<-table2 |> pivot_wider(names_from=type, values_from=count) t2
# A tibble: 6 × 4 country year cases population <chr> <int> <int> <int> 1 Afghanistan 1999 745 19987071 2 Afghanistan 2000 2666 20595360 3 Brazil 1999 37737 172006362 4 Brazil 2000 80488 174504898 5 China 1999 212258 1272915272 6 China 2000 213766 1280428583
위 데이터에 새로운 열을 추가해 봅니다.
mutate(t2, rate=cases/population)
# A tibble: 6 × 5 country year cases population rate <chr> <int> <int> <int> <dbl> 1 Afghanistan 1999 745 19987071 0.0000373 2 Afghanistan 2000 2666 20595360 0.000129 3 Brazil 1999 37737 172006362 0.000219 4 Brazil 2000 80488 174504898 0.000461 5 China 1999 212258 1272915272 0.000167 6 China 2000 213766 1280428583 0.000167
위 결과를 나라별로 rate를 시각화합니다.
table2 %>% pivot_wider(names_from=type, values_from=count) %>% mutate(rate=cases/population)%>% ggplot(aes(x=year, y=rate))+ geom_line(aes(group=country, color=country))+ geom_point(aes(color=country, shape=country))+ scale_x_continuous(breaks=c(1999, 2000))
변환한 데이터 셋 t2의 cases, population, rate를 각 연도로 분리하여 봅니다. 이 변환은 원 데이터에 pivot_wider()함수를 두번 적용한 결과입니다.
table2 %>% pivot_wider(names_from=type, values_from=count) %>% mutate(rate=cases/population)%>% pivot_wider(names_from=year, values_from=c(cases, population, rate))%>% relocate(country, contains('1999'))
# A tibble: 3 × 7 country cases_1999 population_1999 rate_1999 cases_2000 populati…¹ rate_…² <chr> <int> <int> <dbl> <int> <int> <dbl> 1 Afghanistan 745 19987071 0.0000373 2666 20595360 1.29e-4 2 Brazil 37737 172006362 0.000219 80488 174504898 4.61e-4 3 China 212258 1272915272 0.000167 213766 1280428583 1.67e-4 # … with abbreviated variable names ¹population_2000, ²rate_2000
댓글
댓글 쓰기