ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자유자재로 데이터 가공하기 1. 데이터 전처리 dplyr 패키지
    머신러닝 with R 2019. 7. 17. 18:02

    데이터 전처리 (Preprocessing) - dplyr 패키지

     

    바로 이전 포스팅한 글에서 설치한 dplyr 패키지는 데이터 전처리에 특화된 R의 패키지이다. 여기에는 다음과 같은 다양한 함수들이 포함되어 있다. 

     

    함수 기능
    filter( ) 행 추출
    select( ) 열(변수) 추출
    arrange( ) 정렬
    mutate( ) 변수 추출
    summarise( ) 통계치 산출
    group_by( ) 집단별로 나누기
    left_join( ) 데이터 합치기 (열)
    bind_rows( ) 데이터 합치기 (행)

     

    csv_exam 파일을 exam에 넣어 데이터를 준비하고, 패키지를 로드한다.

     

    
    exam <- read.csv("csv_exam.csv.txt")
    str(exam)
    
    library(dplyr)

     

    [filter 함수, 조건에 맞는 데이터만 추출하기]

     

    filter ( ) 함수는 어떤 값만 뽑아 낼 때 사용한다. 

    예를 들어 exam 데이터에서 class가 1 반인 데이터만, 1반이 아닌 나머지 반 학생들의 데이터만, 수학 점수가 50 이상인 학생들 데이터만 뽑아낼 수 있다. 

     

    
    exam %>% filter(class == 1) # 1반 데이터만 추출
    exam %>% filter(class == 2)
    
    exam %>% filter(class != 1) # 1반이 아닌 나머지 모든 반을 추출
    exam %>% filter(class != 3)
    
    exam %>% filter(math > 50)	#수학 점수가 50점 초과인 학생들만 추출
    exam %>% filter(math < 50)
    
    exam %>% filter(class ==1 & math >= 50)	#1반이면서 수학 점수가 50 이상인 학생들만 추출
    exam %>% filter(math >= 90 | english >= 90)	#수학 점수가 90 이상 이거나, 영어가 90 이상인 학생들 추출
    
    exam %>% filter(class ==1 | class == 3 | class == 5)	#1반, 3반, 5반 데이터 추출
    exam %>% filter(class %in% c(1,3,5))	#1반, 3반, 5반 데이터 추출
    
    
    class1 <- exam %>% filter(class == 1)	#class가 1인 행 추출하여 class1에 할당
    class2 <- exam %>% filter(class == 2)
    
    mean(class1$math)	#1반 수학 점수 평균 구하기
    mean(class2$math)

     

     

    %<% 연산자는 파이프라인 연산자로 불리며, 앞으로 이 데이터를 계속 사용하겠다는 의미를 지닌다. 

    [ctrl + shift +m] 이라는 단축키를 사용하면 편리하다.

     

     

     

    R에서 사용하는 연산자

     

    논리 연산자 기능
    < 작다
    <= 작거나 같다
    > 크다
    >= 크거나 같다
    == 같다
    != 같지 않다
    | 또는
    & 그리고
    %in% 매칭확인

     

    산술 연산자 기능
    + 더하기
    - 빼기
    * 곱하기
    / 나누기
    ^, ** 제곱
    %/% 나눗셈의 몫
    %% 나눗셈의 나머지

     

     

     

    [select 함수, 필요한 변수만 추출하기]

    select( ) 함수를 사용하면 필요한 변수만 추출하고, 제외하여 추출할 수도 있다.

     

     

    
    exam %>% select(math)	#math만 추출
    exam %>% select(english)	#english만 추출
    exam %>% select(class, math, english)	#class, math, english 변수 추출
    
    
    exam %>% select(-math)	#math 변수 제외
    exam %>% select(-math, -english)	#math, english 제외
    

     

     

     

    [함수 조합]

    dplyr 패키지 속 함수는 조합하여 사용할 수도 있다.

     

     

    
    #class가 1인 행 추출 한 다음, english 점수만 추출
    exam %>% filter(class ==1) %>% select(english)
    
    
    #가독성 있게 줄 바꾸기
    exam %>%
    	filter(class ==1) %>%
        select(english)
        
        
    #일부만 출력하기 (id, math를 앞부분 6행까지만 추출)
    exam %>%
    	select(id, math) %>%
        head
        
    
    exam %>%
    	select(id, math) %>%
        head(10)
    

     

     

     

     

     

    [순서대로 정렬하기]

    arrange( )

    
    exam %>% arrange(math)	#math 오름차순 정렬
    
    exam %>% arrange(desc(math))	#math 내림차순 정렬
    
    exam %>% arrange(class, math)	#class 및 math 오름차순 정렬
    
    

     

     

     

     

     

    [파생변수 추가하기]

    mutate( )

     

    
    exam %>% 
      mutate(total = math + english + science) %>% #총합변수 추가 
      head #일부추출 
    
    
    exam %>% 
      mutate(total = math + english + science, 
             mean = (math+english+science)/3) %>% 
      head
      
    exam %>%
      mutate(test = ifelse(science >= 60, "pass", "fail")) %>% 
      head
    
    exam %>% 
      mutate(total = math + english + science) %>% 
      arrange(total) %>% 
      head

     

     

     

     

     

    [집단별로 요약하기]

    summarise( )

    summary( )와 다르게 계산된 통계량을 새로운 변수에 할당할 수 있다.

    
    exam %>% summarise(mean_math = mean(math))
    
    exam %>% 
      group_by(class) %>% 
      summarise(mean_math = mean(math))
    
    exam %>% 
      group_by(class) %>%   #class 별로 분리
      summarise(mean_math = mean(math), #math 평균
                sum_math = sum(math), #math 합계
                median_math = median(math), #math 중앙값
                n = n()) #학생수
    

     

     

     

     

     

    [데이터 합치기]

     

    [출처] 실무에서 써먹는 머신러닝 (with R)



    * 가로로 합치기 (행 합치기)

    left_join( )

     

    
    #중간고사 데이터 생성
    test1 <- data.frame(id = c(1,2,3,4,5),
                        midterm = c(60,80,70,90,85))
    
    #기말고사 데이터 생성
    test2 <- data.frame(id = c(1,2,3,4,5),
                        final = c(70,83,65,95,80))
    test1
    test2
    
    #id 기준으로 합치기
    total <- left_join(test1, test2, by = "id")
    total
    
    #반별 담임교사 명단 생성
    name <- data.frame(class = c(1,2,3,4,5),
                       teacher = c("kim", "lee", "park","choi", "jung"))
    name
    
    #class 기준으로 합치기
    exam_new <- left_join(exam, name, by="class")
    exam_new
    

     

     

     

     

    * 세로로 합치기 (열 합치기)

    bind_rows( )

     

    
    #학생 1~5번 시험 데이터 생성
    group_a <- data.frame(id =c(1,2,3,4,5),
                          test = c(60,80,70,90,85))
    group_b <- data.frame(id = c(6,7,8,9,10),
                          test = c(70,83,65,95,80))
    group_a
    group_b
    
    #a, b 데이터 합쳐서 group_all 에 할당
    group_all <- bind_rows(group_a, group_b)
    group_all

     

     

    반응형

    댓글

Designed by Tistory.