데이터 분석/R 데이터 처리 & 분석

[R] tidyr 패키지를 이용한 데이터 재구조(pivot_longer, pivot_wider)

love R 2020. 10. 2. 19:26
반응형

 

1. pivot_longer : 데이터를 long format 으로 변경합니다. 즉, 행 수를 늘리고 열 수를 줄입니다.

 

 

 

1.1. 용법

pivot_longer(
  data, # data frame
  cols, # long format 으로 재구조할 칼럼
  names_to = "name",  # 재구조화된 항목의 칼럼명
  values_to = "value", # 재구조화된 수치의 칼럼명

  names_sep = NULL  # names_to 에 여러 정보를 포함할 경우, 구분자를 기준으로 칼럼 이름을 분할하는 인자
  values_drop_na = FALSE, # 결측치 존재시 포함여부
  ...
)

 

 

1.2. 적용

tidyr의 기본 내장 데이터인 relig_income에는 특정 종교가 있는 사람들의 연간 수입에 대한 빈도 수 정보가 있습니다.

 

가장 왼쪽 칼럼에 종교가 있고 나머지 칼럼에는 연간 소득 정보가 있습니다. 가장 오른쪽 칼럼에는 모르거나 응답을 거부한 빈도 수입니다. 이 때 연간 소득의 정보를 하나의 칼럼에 몰아서 넣는다면 아래와 같은 형태가 될 것입니다.

religion annual_income freq

 

 

pivot_longer함수를이용해서 위와 같이 세 개의 칼럼 형태로 표현하는 것은 다음과 같습니다.

 

long_data <- pivot_longer(data=relig_income, cols=-religion, names_to = 'annual_income', values_to = 'freq')
# data 인자: relig_income
# cols 인자: religion 이라는 칼럼명을 기준으로 데이터 재구조화함.
# 앞에 - 가 붙은 건 해당 칼럼을 기준으로 재구조화한다는 뜻입니다.

long_data


 

 

1.3. 구분자를 기준으로 나누어서 칼럼 생성하기

iris는 다음과 같은 데이터를 가지고 있습니다.

 

 

이제 이 데이터를 아래와 같이 .(dot)을 기준으로 분할하여 변수를 나누어서 만들어봅시다.

Species name name1 value
setosa Sepal Length 5.1
setosa Sepal Width 3.5
setosa Petal Length 1.4

 

pivot_longer(data=iris,
                 cols=Sepal.Length:Petal.Width,
                 names_to=c("name","name1"),
                 names_sep ='\\.')
# names_sep 인자에 .(dot) 을 기준으로 분함
# .(dot)을 인식시키기 위해서 앞에 \\ 을 입력함
# names_to 인자에 분할될 변수명을 정함

 

 

 

 

2. pivot_wider : 데이터를 wide format 으로 변경합니다. 즉, 행 수를 줄이고 열 수를 늘립니다.

 

 

2.1. 용법

pivot_wider는 pivot_longer의 반대 개념인 함수입니다. 위의 pivot_longer를 통해 나온 결과를 다시 원데이터의 형태로 되돌릴 수 있습니다.

pivot_wider(
  data, # data frame
  names_from = name,  # 현재 데이터에서 함수를 적용했을 때 칼럼명으로 갈 칼럼
  values_from = value, # 현재 데이터에서 함수를 적용했을 때 값으로 들어갈 칼럼
  values_fill = NULL, # 결측값이 있을 때 대체할 값
  values_fn = NULL, # 값에 적용할 함수
  ...
)

 

 

 

2.2. 단일 칼럼에 값이 있을 때 적용

위에서 만들어 놓은 long_data 라는 데이터를 pivot_wider 함수에 적용하면 원래 데이터로 되돌릴 수 있습니다.

wide_data <- pivot_wider(data=long_data, names_from=annual_income, values_from =freq)
# data 인자: long_data
# names_from: annual_income(적용될 칼럼)
# values_from: freq(값으로 들어갈 칼럼)

wide_data

 

 

2.3. 다수의 칼럼에 값이 있을 때 적용

tidyr의 us_rent_income은 값이 estiamte열과 moe열이 있습니다.

위에서 본 예는 단일칼럼에 값이 있었지만 이번에는 두 개의 열에 있어서, valuse_from 인자에 두 변수를 지정해주어야 합니다.

us_rent_income



wide_us <- pivot_wider(data=us_rent_income,
                               names_from=variable, 
                               values_from=c(estimate, moe))
# values_from 인자에 c(estimate, moe) 를 지정해줍니다.

wide_us

 

 

2.4. 결과 데이터에 적용될 함수

pivot_wider 함수의 values_fn 인자에는 결과 데이터에 적용될 함수를 쓸 수 있습니다.

iris 데이터에서 종별로 평균값을 내고 싶다고 한다면 다음과 같이 적용할 수 있습니다.

 

long_iris <- iris %>%  pivot_longer(cols=-Species)
long_iris


long_iris %>%  pivot_wider(names_from=name,
                                     values_from = value,
                                     values_fn=mean)

 

반응형