2019. 4. 18. 03:03ㆍR/Advanced

목적
DSR 패키지에 포함된 데이터셋으로 정돈된 데이터 연습
다른 패키지와 tidyr의 함수 대응 관계는 아래와 같다
reshape2의 melt와 dcast는 tidyr의 gather와 spread로 대체 가능하다
tidyr |
gather |
spread |
reshape2 |
melt |
cast |
spreadsheets |
unpivot |
pivot |
databases |
fold |
unfold |
사용한 패키지
1 2 | library(tidyverse) library(DSR) |
TB를 포함한 table1~6에서 Spread와 Gather사용

1 2 3 4 5 6 7 8 9 10 11 | > table1 # A tibble: 6 x 4 country year cases population <fct> < 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 |
아프가니스탄, 브라질, 중국의 1999년과 2000년의 플루 감염자와 전체 인구 데이터

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | > table2 # A tibble: 12 x 4 country year key value <fct> < int > <fct> < 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 |
table2는 table1의 데이터를 gather한 형태다
다시 spread로 만들어보면 아래와 같다. table1과 동일한 형식이다
1 2 3 4 5 6 7 8 9 10 | > table2 % > % spread(key, value) # A tibble: 6 x 4 country year cases population <fct> < 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 |

table3는 case/population의 rate라는 새로운 변수로 변경한 데이터 테이블이다
1 2 3 4 5 6 7 8 9 10 | > table3 # A tibble: 6 x 3 country year rate <fct> < int > < chr > 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 |
Separate를 사용하여 table1과 동일하게 만들 수 있다
1 2 3 4 5 6 7 8 9 10 | > table3 % > % separate(rate, c( "case" , "population" )) # A tibble: 6 x 4 country year case population <fct> < int > < chr > < chr > 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 |

table4와 table5는 case와 population을 분리해놓은 케이스다
1 2 3 4 5 6 7 8 9 10 11 12 13 | > table4; table5 # A tibble: 3 x 3 country ` 1999 ` ` 2000 ` <fct> < int > < int > 1 Afghanistan 745 2666 2 Brazil 37737 80488 3 China 212258 213766 # A tibble: 3 x 3 country ` 1999 ` ` 2000 ` <fct> < int > < int > 1 Afghanistan 19987071 20595360 2 Brazil 172006362 174504898 3 China 1272915272 1280428583 |
table1 형식으로 만들기 위해서는 두 데이터를 합쳐야 한다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | x < - table4 % > % gather( "year" , "case" , 2 : 3 ) y < - table5 % > % gather( "year" , "population" , 2 : 3 ) > x;y # A tibble: 6 x 3 country year case <fct> < chr > < int > 1 Afghanistan 1999 745 2 Brazil 1999 37737 3 China 1999 212258 4 Afghanistan 2000 2666 5 Brazil 2000 80488 6 China 2000 213766 # A tibble: 6 x 3 country year population <fct> < chr > < int > 1 Afghanistan 1999 19987071 2 Brazil 1999 172006362 3 China 1999 1272915272 4 Afghanistan 2000 20595360 5 Brazil 2000 174504898 6 China 2000 1280428583 z < - data.frame(x, y[ 3 ]) > z country year case population 1 Afghanistan 1999 745 19987071 2 Brazil 1999 37737 172006362 3 China 1999 212258 1272915272 4 Afghanistan 2000 2666 20595360 5 Brazil 2000 80488 174504898 6 China 2000 213766 1280428583 |
table6는 연도가 분리되어 있고, rate 변수가 포함되어 있다
1 2 3 4 5 6 7 8 9 10 | > table6 # A tibble: 6 x 4 country century year rate <fct> < chr > < chr > < chr > 1 Afghanistan 19 99 745 / 19987071 2 Afghanistan 20 00 2666 / 20595360 3 Brazil 19 99 37737 / 172006362 4 Brazil 20 00 80488 / 174504898 5 China 19 99 212258 / 1272915272 6 China 20 00 213766 / 1280428583 |
unite로 연도를 합치고 rate를 separate로 분리한다
1 2 3 4 5 6 7 8 9 10 11 | > table6 % > % unite( "year" , century, year, sep = "") % > % + separate(rate, c( "case" , "population" )) # A tibble: 6 x 4 country year case population <fct> < chr > < chr > < chr > 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 |
WHO 데이터 정돈하기

-
rel : 재발(relapse)
-
ep : 폐외 결핵(extrapulmonary TB)
-
sn : pulmonary smear로 검진할 수 없는 음성
-
sp : pulmonary smear로 검진할 수 있는 양성
위 데이터는 변수에 3개의 데이터가 들어가 있기 때문에 Untidy Data
Long Data로 변경한 후 변수를 분리해줘야 한다
1 | who % > % gather( "new" , "value" , 5 : 60 ) |

New 변수에는 SP(TB 검진 결과), 성별, 연령대가 포함되어 있다
이 변수들을 분리 해줘야 한다
1 2 | who % > % gather( "new" , "value" , 5 : 60 ) % > % separate(new, c( "new" , "type" , "sexage" )) |

sexage 변수에는 아직 성별과 연령대가 분리되지 않았다
1 2 3 | who % > % gather( "new" , "value" , 5 : 60 ) % > % separate(new, c( "new" , "type" , "sexage" )) % > % separate(sexage, c( "sex" , "age" ), sep = 1 ) |

연령과 성별이 완전히 분리되었다
쓸데 없는 변수를 제거해준다
1 2 3 4 5 | who % > % gather( "new" , "value" , 5 : 60 ) % > % separate(new, c( "new" , "type" , "sexage" )) % > % separate(sexage, c( "sex" , "age" ), sep = 1 ) % > % select( - country, - iso2, - new) % > % rename(nation = iso3) |

만약, 다시 데이터를 펼치고 싶다면 spread를 사용하면 된다
1 2 3 4 5 6 | who % > % gather( "new" , "value" , 5 : 60 ) % > % separate(new, c( "new" , "type" , "sexage" )) % > % separate(sexage, c( "sex" , "age" ), sep = 1 ) % > % select( - country, - iso2, - new) % > % rename(nation = iso3) % > % spread( type , value)> |

'R > Advanced' 카테고리의 다른 글
R로 텔레그램봇에 메세지 보내기 (0) | 2019.06.02 |
---|---|
ggmap을 사용하여 서울 지하철 역 위치 및 사용자 수 표시 (0) | 2019.05.07 |