본문 바로가기
R

R - 데이터 분석 (2) : tidyr 패키지

by Tiabet 2023. 5. 20.

포스팅이 많이 늦어져 버렸다. 이번 포스팅에선 데이터 프레임을 깔끔하게 정리할 수 있는 tidyr 패키지와 그 함수들에 대해서 간략하게 정리해보고자 한다.

 

 

데이터를 깔끔하게 정리하는 것은 아주 중요한 일이다. 시각화 하기도 편하고, 데이터 분석 모델들을 사용하기에도 편하기 때문이다. 파이썬에서는 보통 pandas 패키지 안에 이렇게 tidy한 데이터를 만드는 데에 필요한 함수들이 다 들어있지만, R에는 tidyr 이라는 패키지가 있다. 

 

tidyr에서 중요하게 쓰이는 함수들을 간략하게 살펴보겠다.

 

library(tidyr)
table4a

함수들을 사용해보기 위해 tidyr 패키지에 들어있는 데이터셋 중 하나인 table4a 를 불러오도록 한다. 참고로 사용할 모든 table 들은 나라의 결핵 환자 수라고 한다.

확인해보면 3x3 짜리의 작은 table 형식의 데이터셋인 것을 확인할 수 있다. 현재 column이 1999, 2000 이고 데이터 값으로 숫자들이 들어있는 것을 볼 수 있는데, column을 데이터 값으로 넣어서 세로로 길게 늘려보도록 하자.

 

#make data longer by row
long = table4a %>% pivot_longer(names_to = 'years', values_to = 'cases', -country)
print(long)

파이프 오퍼레이터 %>%을 사용하고, pivot_longer 라는 함수를 사용하면 아래처럼 데이터프레임이 변경된다.

다시 데이터 프레임을 원래대로 돌리려면 pivot_wider()를 사용하면 된다.

 

#make data longer by column
back2wide = long %>% pivot_wider(names_from = 'years', values_from = 'cases')
print(back2wide)

디테일하게 보면 pivot_longer의 파라미터로는 names_to, values_to 가 있고, pivot_wider()의 파라미터로는 names_from, values_from 이 있다. 대충 이런 식으로 코드를 쓰기만 해도 알아서 정리를 해주어서 간단하다고 볼 수 있다.

 

table3

이번엔 table3 데이터셋을 불러보자.

결핵 환자의 비율이 담겨있는 데이터셋이다. rate 쪽을 확인해보면 / 기호를 통해 비율을 알려주고 있는데, separate() 함수를 통해 이 column을 두 개로 분리할 수 있다.

 

table3 %>%
  separate(rate, into = c("cases", "population"))

이런 식으로 column 이름만 지정해주면 두 column으로 분리가 가능하다. 특이한 것은 무엇으로 나누면 좋을지 (여기선 / ) 파라미터로 제공하지 않았음에도 알아서 인식하고 나눠준다는 점이다.

 

table5

이번엔 table5를 확인해보자.

연도를 나타내는 columnn이 century와 year 두 개로 분리되어 있다. separate()와 반대로 합치는 함수는 unite()가 있다.

table5 %>%
  unite(new, century, year, sep = "")

이런 식으로 합쳐주는 것도 간단하게 구현할 수 있다. 파라미터의 입력 순서에 유의해야 할 것 같다.

 

결측치를 보간하는 함수도 tidyr에 있다.

#fill na with before data
score = tribble(
  ~ person, ~ Math, ~ Computer,
  "Henry",  1,         7,
  NA,       2,         10,
  NA,       NA,        9,
  "David",  1,         4)

score

이렇게 결측치들이 많은 데이터셋에 fill 함수를 사용해보자.

 

score %>%
  fill(person, Math)

fill 함수를 사용하면 이런 식으로 알아서 NA 이전 열의 데이터로 NA를 채워준다. 이전 값으로 보간하는 것이 아니라 특정 값을 채우고 싶으면 replace_na 함수를 사용하면 된다.

score %>% replace_na(replace = list(person = "unknown", Math = 0))

person을 unknown으로, Math는 0으로 결측치를 채웠다.

 

 

이 정도로 tidyr의 주요 함수들을 살펴보았다.