R

[혼자 공부하는 R 데이터분석] 5주차_데이터 가공하기(dplyr, 데이터 결합, reshape2)

섀싹 2024. 8. 3. 03:06

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)