[혼자 공부하는 R 데이터분석] 5주차_데이터 가공하기(dplyr, 데이터 결합, reshape2)
5-1. dplyr 패키지
* 데이터 가공 패키지
* R 내장 데이터인 mtcars 이용
사용법 | 기능 및 설명 | 예시 |
filter(데이터, 조건문) | 조건에 맞는 데이터 필터링 조건문 여러개 쓰려면 & 연산자 사용 |
filter(mtcars, cyl==4) filter(mtcars, cyl>=6 & mpg>20) |
select(데이터, 변수명1, 변수명2..) | 지정한 변수(열)만 추출 | select(mtcars, am, gear) |
arrange(데이터, 변수명1, 변수명2...) arrange(데이터, 변수명1, 변수명2, ..., desc(변수명)) |
오름차순 정렬, 내림차순 정렬 변수가 여러개 있을 경우 첫번째 변수로 정렬 후 동일 값에 대해 두번째 변수로 정렬. |
arrange(mtcars, wt) arrange(mtcars, mpg, desc(wt)) |
mutate(데이터, 추가할 변수 이름 = 조건 1, ...) |
데이터 세트에 열 추가 | mutate(mtcars, years = "1974") mutate(mtcars, mpg_rang = rank(mpg)) * rank() 함수는 데이터 순위 확인시 사용 값이 같은 경우 소수점 순위로 반환 |
distinct(데이터, 변수명) | 중복 값 제거 한번에 열을 여러개 지정시 각 열에서 중복 값이 제거되는 것이 아니라 지정한 열들의 모든 값이 동일할 때만 제거됨. * 인덱스 값은 가장 먼저 나오는 값이 출력됨 |
distinct(mtcars, cyl) distinct(mtcars, gear) distinct(mtcars, cyl, gear) |
summarise(데이터, 요약할 변수명 = 기술통계 함수) | 데이터 요약 확인할 때 사용 | summarise(mtcars, cyl_mean = mean(cyl), cyl_min = min(cyl), cyl_max = max(cyl)) summarise(mtcars, mean(cyl), min(cyl), max(cyl)) |
group_by(데이터, 변수명) | 데이터를 지정한 조건에 따라 그룹으로 묶음 * n(), n_distinct() 함수는 단독으로 사용 불가능. summarise(), mutate(), filter() 함수와 같이 사용해야함, |
gr_cyl <- group_by(mtcars, cyl) summarise(gr_cyl, n()) *n() : 데이터 개수 구하는 함수 gr_cyl <- group_by(mtcars, cyl) summarise(gr_cyl, n_distinct(gear)) *n_distinct() : 중복값 제외한 데이터 개수 |
sample_n(데이터, 샘플 추출할 개수) | 전체 데이터에서 샘플 데이터를 개수 기준으로 추출 *무작위 추출 |
sample_n(mtcars, 10) |
sample_frac(데이터, 샘플 추출할 비율( | 전체 데이터에서 샘플 데이터를 비율 기준으로 추출 *무작위 추출, 비율 소수점 아래는 반올림 |
sample_frac(mtcars, 0.2) |
데이터 세트 %>% 조건 또는 계산 %>% 데이터 세트 | 함수를 연달아 사용시 함수 결과값을 변수로 저장하는 과정을 거치치 않고 값을 받아 함수로 바로 이어서 사용할 수 있도록 해주는 연산자 | group_by(mtcars, cyl) %>% summarise(n()) mutate(mtcars, mpg_rank = rank(mpg)) %>% arrange(mpg_rank) |
5-2. 데이터 가공하기
데이터 정렬 패키지(dplyr)를 이용하여 위 함수를 데이터에 적용해보는 내용
데이터 결합 부분만 다루겠음.
데이터 결합은 크게 세로 결합과 가로 결합으로 나뉜다
- 세로 결합
결합할 테이블에 있는 변수명을 기준으로 결합한다. 각 테이블에 서로다른 변수도 결합하는 테이블에 추가된다.
공통 변수를 기준으로 결합하고, 서로 겹치지 않는 변수는 모두 새로운 테이블에 추가된다.
만약 추가되는 변수의 값이 서로 없다면 NA 로 적히게 된다.
bind_rows(테이블명, 테이블명)
* 먼저 적은 테이블명이 새로운 테이블 상단에 위치
ex)
library(readxl)
m_history <- read_excel("C:/Rstudy/Sample2_m_history.xlsx")
f_history <- read_excel("C:/Rstudy/Sample3_f_history.xlsx")
View(m_history)
View(f_history)
exdata_bindjoin <- bind_rows(m_history, f_history)
View(exdata_bindjoin)
- 가로 결합
가로 결합 방식 함수는 테이블 결합 기준이 되는 by="변수명"에 사용할 변수가 필요하다.
이러한 변수를 키 변수라고 한다.
한 쪽이라도 키 변수가 없으면 실행되지 않음. (변수명 다를 시 통일 필요)
left_join(테이블1, 테이블2, by="변수명")
inner_join(테이블1, 테이블2, by="변수명")
full_join(테이블1, 테이블2, by="변수명")
- left_join() 함수 : 지정한 변수와 테이블1을 기준으로 테이블2에 있는 나머지 변수들 결합 (<-> right_join() 은 위와 반대). 일종의 차집합
- inner_join() 함수 : 테이블1과 테이블2에서 기준으로 지정한 변수 값이 동일할 때만 결합. 일종의 교집합
- full_join() 함수 : 테이블1과 테이블2에서 기준으로 지정한 변수 값 전체 결합. 일종의 합집합
ex)
library(readxl)
jeju_y21_history <- read_excel("C:/Rstudy/Sample4_y21_history.xlsx")
jeju_y20_history <- read_excel("C:/Rstudy/Sample5_y20_history.xlsx")
View(jeju_y21_history)
View(jeju_y20_history)
bind_col <- left_join(jeju_y21_history, jeju_y20_history, by="ID")
View(bind_col)
bind_col_inner <- inner_join(jeju_y21_history, jeju_y20_history, by = "ID")
View(bind_col_inner)
bind_col_full <- full_join(jeju_y21_history, jeju_y20_history, by="ID")
View(bind_col_full)
- 확인문제
# 244 페이지
# 확인문제 2번
library(dplyr)
library(readxl)
exdata1 <- read_excel("C:/Rstudy/Sample1.xlsx")
exdata1
exdata2 <- exdata1 %>% filter(AGE<=30 & Y20_CNT >= 10)
exdata2
# 확인문제 3번
exdata2 %>% arrange(desc(AGE), Y20_CNT)
# 확인문제 4번
bind_col = left_join(jeju_y21_history, jeju_y20_history, by="ID")
bind_col
5-3. 데이터 구조 변형하기
reshape2 패키지를 이용하여 데이터를 재구조화 한다.
install.packages("reshape2")
library(reshape2)
-melt() 함수
넓은 모양 데이터 (열이 많은 데이터) 에서 행렬의 열을 행으로 세로로 길게 바꿔주는 함수
melt(데이터, id.vars = "기준 열", measure.vars = "변환 열")
id.vars 옵션과 measure.vars 옵션은 기준 열에 따라 재배치할 열을 결정하는 옵션이다.
ex)
R은 대문자 소문자를 구분하기 때문에 변수명 소문자로 맞춰주면 이후 과정 좀 더 용이
head(airquality)
names(airquality) <- tolower(names(airquality))
head(airquality)
melt_test <- melt(airquality)
head(melt_test)
tail(melt_test)
melt_test2 <- melt(airquality, id.vars = c("month", "wind"), measure.vars = "ozone")
head(melt_test2)
-cast() 함수
긴 모양 데이터 (행이 많은 데이터) 에서 행렬의 행을 열로 가로로 길게 바꿔주는 함수
- acast : 데이터를 변형하여 벡터, 행렬, 배열 형태로 반환
- dcast : 데이터를 변형하여 데이터 프레임 형태로 반환
dcast(데이터, 기준 열 ~ 반환 열)
acast(데이터, 기준 열 ~ 반환 열 ~ 분리 기준 열)
ex)
na.rm 은 결측치 포함 여부 인데 FALSE 로 지정할 경우 결측치도 포함된다.
값이 빈 값이 아닌 na 값으로 채우기 위함. (결측치 remove 의 약자로 추정됨 뇌피셜)
# cast
names(airquality) <- tolower(names(airquality))
head(airquality)
library(reshape2)
aq_melt <- melt(airquality, id.vars = c("month", "day"), na.rm = FALSE)
head(aq_melt)
aq_dcast <- dcast(aq_melt, month+ day ~ variable)
head(aq_dcast)
View(airquality)
View(aq_melt)
View(aq_dcast)
acast(aq_melt, day ~ month ~ variable)
acast(aq_melt, month ~ variable, mean)
dcast(aq_melt, month ~ variable, sum)
- 확인문제
# 260-261 페이지 확인문제
# 2번
names(iris) <- tolower(names(iris))
head(iris)
# 3번
iris_test <- melt(iris, id.vars = "species", measure.vars = "sepal.length")
iris_test
# 4번
library(readxl)
middle_mid_exam <- read_excel("C:/Rstudy/middle_mid_exam.xlsx")
View(middle_mid_exam)
library(reshape2)
names(middle_mid_exam) <- tolower(names(middle_mid_exam))
MATHEMATICS <- middle_mid_exam %>% select(-english)
MATHEMATICS <- dcast(MATHEMATICS, id ~ class)
View(MATHEMATICS)
ENGLISH <- middle_mid_exam %>% select(-mathematics)
ENGLISH <- dcast(ENGLISH, id ~ class)
View(ENGLISH)
5-4. 데이터 정제하기
- 결측치
사용법 | 기능 |
is.na(변수명) | 결측치를 확인하여 결과값을 TRUE 와 FALSE 로 반환 *결측치는 TRUE 반환 |
table(is.na(변수명)) | 결측치 빈도 확인 (TURE 몇개 FALSE 몇개로 나옴) |
na.rm = T 옵션 | 결측치를 제외하는 방법 |
sum(is.na(변수명)) | 결측치 총 몇개인지 확인 |
colSums(is.na(변수명)) | 각 컬럼의 결측치 개수 확인 |
na.omit(변수명) | 결측치가 있는 행 전체 제거 |
변수명[is.na(변수명)] <- 대체할 값 | 결측치 다른 값으로 대체 |
# 결측치
x <- c(1, 2, NA, 4, 5)
x
sum(x)
is.na(x)
table(is.na(x))
sum(x, na.rm = T)
data(airquality)
is.na(airquality)
sum(is.na(airquality))
colSums(is.na(airquality))
na.omit(airquality)
airquality[is.na(airquality)] <- 0
colSums(is.na(airquality))
- 이상치
사용법 | 기능 |
boxplot(변수명$컬럼명) | boxplot 으로 데이터 이상치 확인 |
boxplot(변수명)$stats | 기술통계량 확인(다섯가지 요약값) |
ifelse(조건문, 조건이 참일 때 실행, 조건이 거짓일 때 실행) | 조건에 대해 값을 반환하는 함수. 이상치가 있을 때는 해당 값을 결측치로, 그렇지 않을 경우에는 원래의 값이 반환되도록 코드를 작성할 수 있음. |
# 이상치
data(mtcars)
boxplot(mtcars$wt)
boxplot(mtcars$wt)$stats
mtcars$wt > 5.25
mtcars$wt <- ifelse(mtcars$wt > 5.25, NA, mtcars$wt)
mtcars$wt
5-5. 과제
1. 필수과제
library(dplyr)
library(readxl)
exdata1 <- read_excel("C:/Rstudy/Sample1.xlsx")
exdata1
exdata2 <- exdata1 %>% filter(AGE<=30 & Y20_CNT >= 10)
exdata2
2. 추가과제
# 4번
library(readxl)
middle_mid_exam <- read_excel("C:/Rstudy/middle_mid_exam.xlsx")
View(middle_mid_exam)
library(reshape2)
names(middle_mid_exam) <- tolower(names(middle_mid_exam))
MATHEMATICS <- middle_mid_exam %>% select(-english)
MATHEMATICS <- dcast(MATHEMATICS, id ~ class)
View(MATHEMATICS)
ENGLISH <- middle_mid_exam %>% select(-mathematics)
ENGLISH <- dcast(ENGLISH, id ~ class)
View(ENGLISH)