-
자유자재로 데이터 가공하기 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()) #학생수
[데이터 합치기]
* 가로로 합치기 (행 합치기)
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
반응형'머신러닝 with R' 카테고리의 다른 글
R 데이터 정제/ 결측치 및 이상치 제거하기 (0) 2019.07.18 자유자재로 데이터 가공하기2. 데이터 전처리/ dplyr 패키지/mpg 데이터 심화 활용 (0) 2019.07.18 R 데이터 분석의 기초 2. 데이터 수정하기 / 변수 이름 바꾸기/ 파생 변수 생성/ 조건문 ifelse 활용 (예제 있음) (0) 2019.07.16 R 데이터 분석의 기초 1. 데이터 파악하기 - head/tail/dim/View/str/summary (0) 2019.07.16 R 데이터 프레임 (Data Frame) / 엑셀, csv 데이터 불러오기 / 데이터 저장하기 / RData (.rda) 파일 (0) 2019.07.01