[R] 데이터 정제를 위한 "dplyr, tidyr" 패키지 소개

 정보

  • 업무명     : 데이터 정제를 위한 "dplyr, tidyr" 패키지 소개

  • 작성자     : 박진만

  • 작성일     : 2020-02-07

  • 설   명      :

  • 수정이력 :

 

 내용

[특징]

  • R 에서 데이터를 조작하고 다루는 패키지 (dplyr, tidyr) 를 소개한다.

 

[기능]

  • 변수 (열)의 선택

  • 변수 (열)의 신규 생성 및 업데이트

  • 레코드 (행)를 조건에 따라 추출 및 정렬

  • 데이터 집계 (요약)

  • 데이터 그룹화

  • 여러 데이터 집합을 결합

  • wide 형 (가로형)과 long 형 (세로 형)를 변환

  • 열 결합 및 분리

 

[활용 자료]

  • Iris 예제 데이터를 포함한 예시 데이터

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 첨부코드 참조

 

[사용 OS]

  • Windows10

 

[사용 언어]

  • R v3.6.2

  • R Studio v1.2.5033

 

 소스 코드

 

[개요]

  • dplyr, tidyr 은 R 에서 데이터 프레임을 조작하는 패키지

  • 주로 데이터를 전처리를 위해 사용됨

  • %>% 파이프 연산자를 이용해 체인 형식의 코드 사용 가능

 

[해당 패키지의 장점과 단점]

  • 장점

    • 직관적이고 이해하기 쉬운 코드

    • 불필요한 객체 생성이 필요없음.

    • 빠른 처리속도 및 메모리 소모가 적음

    • dplyr과 tidyr 의 병행 사용이 가능

  • 단점

    • 사용 가능한 함수가 제한적임

    • 코드 작성 방식에 있어서 심한 호불호 존재함

 

[명세]

[준비작업]

  • 패키지 설치 및 로드

install.packages("dplyr")
install.packages("tidyr")
library(dplyr)
library(tidyr)

 

  • 패키지 설치 확인

installed.packages() %>%
  as.data.frame() %>%
  select_("Package"," Version") %>%
  filter(Package %in% c("dplyr", "tidyr"))
  • 패키지는 CRAN에서 다운 받아짐

  • 성공적으로 패키지가 설치 되었다면 아래와 같은 메시지가 출력된다.

    • 버전은 다를 수 있음.

    • 본 글에서는 아래 이미지에 해당하는 버전으로 코드를 수행하였음

 

 

[열 선택]

  • 변수 (열) 의 선택 : select 

df <- iris %>%
	dplyr::select(Sepal.Width,Species)
    
head(df, 3)

etc-image-0

 

  • 사용방법 : dplyr::select (데이터프레임, c(열1,열2...) )

  • 열 지정 방법은 기본함수인 "subset" 과 동일함

  • 열 지정의 경우 특별한 기능을 사용할 수 있음 (하단 참조)

 

  • 열 선택용 함수 : starts_with() 

df <- iris %>%
	dplyr::select(starts_with("sepal"))
    
head(df, 3)

etc-image-1

 

  • start_with (x, ignore.case = TRUE)

  • 열의 시작 글자가 일치하는 변수를 검색함

  • 덧붙여 ignore.case = FALSE로 하면 대소문자 구분이 가능함

 

  • 열 선택용 함수 : contains() 

df <- iris %>%
	dplyr::select(contains("pe"))
    
head(df, 3)

etc-image-2

 

  • ontains (x, ignore.case = TRUE)

  • 열 이름이 부분적으로 일치하는 경우 열 이름을 검색하여 가져옴

 

  • 열 선택용 함수 : matches() 

df <- iris %>%
	dplyr::select(matches(".t."))
    
head(df, 3)

etc-image-3

 

  • [matches (x, ignore.case = TRUE)

  • 정규 표현식을 지정하고 변수를 가져 옴

 

  • 열 선택용 함수 : num_range() 

df <- as.data.frame(matrix(1:30, nrow = 3, ncol = 10))

colnames(df) <- c(paste0("beer", 1:5), paste0("sake0", 1:5))

ls(df)

etc-image-4

dplyr::select(df, num_range("beer", 1:3, 1))

etc-image-5

dplyr::select(df, num_range("sake", 2:4, 2))

etc-image-6

  • num_range ( "문자열",대상의 숫자, 자릿수)

  • "beer1에서 beer3까지" 형식의 지정 방법. 즉 열 이름에 번호가 부여되어 있어야 함.

 

  • 열 선택용 함수 : one_of() 

vname <- c("Petal.Length", "Sepal.Width")

df <- iris %>%
	dplyr::select(one_of(vname))
    
head(df, 3)

etc-image-7

  • 변수 이름을 문자열 벡터로 정리해 전달 때 사용.

 

  • 열 선택용 함수 : everything() 

df <- as.data.frame(matrix(1:15, nrow = 3, ncol = 5))
  colnames(df) <- c("Incheon", "Pusan", "Daegu", "Daesjeon", "Ulsan")
  
dplyr::select(df, everything())

etc-image-8

dplyr::select(df, Incheon, Pusan, everything())

etc-image-9

  • 전부 가져옴

 

[열 신규 생성 및 업데이트]

  • dplyr::mutate

df <- iris %>%
	dplyr::mutate(beer=Sepal.Width*2)
    
head(df, 2)

etc-image-10

df <- iris %>%
	dplyr::mutate(beer=Sepal.Width*3)
    
head(df, 2)

etc-image-11

  • dplyr :: mutate (데이터프레임, 변수이름 = 처리내용)

  • 데이터 프레임에 새로운 열을 추가

  • 변수 이름에 기존 변수를 지정하면 덮어쓰기됨

 

[조건에 따른 행 추출 및 정렬]

  • dplyr::filter()

df <- iris %>%
	dplyr::filter(Species=='virginica')
    
head(df, 3)

etc-image-12

  • dplyr :: filter (데이터 프레임 조건식)

  • 사용법은 subset ()과 동일

 

  • dplyr::arrange()

df <- iris %>%
	dplyr::arrange(Sepal.Length)
    
head(df, 3)

etc-image-13

df <- iris %>%
	dplyr::arrange(desc(Sepal.Length))
    
head(df, 3)

etc-image-14

  • asc 또는 아무것도 안 적음 : 오름차순 정렬

  • desc : 내림차순 정렬

  • 두개 이상의 열에 대해서도 가능 

 

[데이터 집계 및 요약]

  • dplyr::summarize()

df <- iris %>%
	dplyr::summarize(varmean=mean(Sepal.Length))
df

etc-image-15

  • dplyr :: summarize (데이터 프레임, 새로운 변수 이름 = 함수 (처리 대상의 변수 이름))

  • 열의 집계를 산출

  • 각종 집계 함수 sum, sd, mean 등 사용 가능

 

[기타 summarize 관련 함수]

  • 이외에도 summarize_if(), summarize_at(), summarize_all()가 존재함

  • 자세한 내용은 dplyr 도움말 참조

 

[데이터 그룹화]

  • dplyr::group_by()

df <- iris %>%
	dplyr::group_by(Species) %>% 
 	dplyr::summarize(cmean=mean(Sepal.Length))
    
df

etc-image-16

  • dplyr :: group_by (변수1,변수2...)

  • 위 코드를 실행하면 데이터가 그룹화 됨

  • 이 후 summarize 등 그룹별로 원하는 작업을 수행할 수 있다.

 

[여러 데이터 세트 결합]

  • 데이터 세트 준비

a <- data.frame(x1=c("A","B","C"),x2=1:3)
b <- data.frame(x1=c("A","B","D"),x3=c(TRUE, FALSE, TRUE))
y <- data.frame(x1=c("A","B","C"),x2=1:3)
z <- data.frame(x1=c("B","C","D"),x2=2:4)

 

 

  • dplyr::full_join()
df <- dplyr::full_join(a,b,by="x1")

etc-image-17

  • dplyr :: full_join (데이터 프레임 1, 데이터 프레임 2, by = 키 변수)

  • 모든 행과 열을 결합

  • 해당 사항이없는 경우 NA이 들어가게 됨

 

  • dplyr::inner_join()

df <- dplyr::inner_join(a,b,by="x1")

etc-image-18

  • dplyr :: inner_join (데이터 프레임 1, 데이터 프레임 2, by = 키 변수)

  • 두 데이터 프레임에 존재하는 행만을 남겨 결합함

 

  • dplyr::bind_cols()

df <- dplyr::bind_cols(y, z)
df

etc-image-19

  • 왼쪽의 데이터 프레임에 오른쪽 데이터 프레임의 열을 추가함

  • 행 수가 일치하지 않은경우 오류가 발생함

 

  • dplyr::bind_rows()

df <- dplyr::bind_rows(y, z)
df

etc-image-20

  • 왼쪽의 데이터 프레임에 오른쪽 데이터 프레임의 행을 추가함

  • 열 수가 일치하지 않은경우 오류가 발생함

 

  • dplyr::bind_rows(... .id=)

df <- dplyr::bind_rows(y, z, .id = "df_id")
df

etc-image-21

  • 인수 .id=**를 지정하면 테이블 id를 변수로 만들어줌

  • 이는 굉장히 편리한 기능임

 

[데이터프레임의 행,열을 변환]

  • tidyr :: gather()

df <- iris %>%
	tidyr::gather(key = keykey, value = valuevalue, -Species)
    
head(df, 4)

etc-image-22

  • data : 사용하는 데이터 프레임

  • key : 정리했을 때, "이 행의 값은 어떤 변수에 들어갈 것인가"를 나타내는 변수.

  • value : 정리 한 변수의 값.

  • ... : 정리할 변수를 지정한다. 즉 dplyr :: select ()의 기법을 그대로 사용할 수 있음.

 

  • tidyr :: spread()

df <- iris %>%
	dplyr::mutate(id=rownames(iris)) %>% 
  	tidyr::gather(key = keykey, value = valuevalue, contains("l."))
    
head(df,2)

etc-image-23

 

df_2 <- df %>%
	tidyr::spread(key = keykey, value = valuevalue)
    
head(df_2,2)

etc-image-24

  • gather과 반대로 작용함.

  • 그러나 spread를 실행 한 후 기본 키가 될 수 있는 변수가 존재할 필요가 있음

 

[열 결합 및 분리]

  • tidyr::unite

df <- iris %>%
	tidyr::unite(col = colll, starts_with("Sepal"), sep = "-")
    
head(df)

etc-image-25

  • 여러개의 열을 하나로 합침

 

  • tidyr : separate

df <- iris %>%
	tidyr::unite(col = colll, starts_with("Sepal"), sep = "-")

df2 <- df %>%
	tidyr::separate(col = colll, into = c("Sepal.Length","Sepal.Width"), sep = "-")
    
head(df2)

etc-image-26

  • 하나의 열을 지정한 문자로 분할하여 별도의 열에 지정함

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com