정보

    • 업무명     : 데이터 정제를 위한 "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)

     

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

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

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

     

    • 열 선택용 함수 : starts_with() 

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

     

    • start_with (x, ignore.case = TRUE)

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

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

     

    • 열 선택용 함수 : contains() 

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

     

    • ontains (x, ignore.case = TRUE)

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

     

    • 열 선택용 함수 : matches() 

    df <- iris %>%
    	dplyr::select(matches(".t."))
        
    head(df, 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)

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

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

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

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

     

    • 열 선택용 함수 : one_of() 

    vname <- c("Petal.Length", "Sepal.Width")
    
    df <- iris %>%
    	dplyr::select(one_of(vname))
        
    head(df, 3)

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

     

    • 열 선택용 함수 : everything() 

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

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

    • 전부 가져옴

     

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

    • dplyr::mutate

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

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

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

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

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

     

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

    • dplyr::filter()

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

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

    • 사용법은 subset ()과 동일

     

    • dplyr::arrange()

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

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

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

    • desc : 내림차순 정렬

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

     

    [데이터 집계 및 요약]

    • dplyr::summarize()

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

    • 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

    • 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")
    

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

    • 모든 행과 열을 결합

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

     

    • dplyr::inner_join()

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

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

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

     

    • dplyr::bind_cols()

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

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

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

     

    • dplyr::bind_rows()

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

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

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

     

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

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

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

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

     

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

    • tidyr :: gather()

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

    • 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)

     

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

    • gather과 반대로 작용함.

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

     

    [열 결합 및 분리]

    • tidyr::unite

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

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

     

    • 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)

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

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

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

    • sangho.lee.1990@gmail.com

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

    • saimang0804@gmail.com
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기