파이프라인 연산자 %>% : 단축키는 ctrl + shitf + m
R의 dplyr 패키지는 데이터 처리와 분석을 위한 강력한 도구
특히 파이프라인 연산자 %>%를 사용하여 직관적이고 효율적인 코드 작성이 가능
dplyr 함수 | 기능 |
filter() | 행추출 |
select() | 열(변수)추출 |
arrange() | 정렬 : 기본값은 오름차순 |
mutate() | 변수 추가 |
summarise() | 통계치 산출 |
group_by() | 집단별로 나누기 |
left_join() | 데이터 합치기(열) |
bind_rows() | 데이터 합치기(행) |
파이프라인 연산자 %>%
- dplyr 패키지에서는 파이프라인 연산자 %>%를 사용하여 함수들을 연결할 수 있습니다.
- 이를 통해 데이터 처리 과정을 단계별로 작성할 수 있어 코드의 가독성과 유지보수성이 높아집니다.
- 파이프라인 연산자 %>%는 왼쪽의 데이터 프레임을 오른쪽 함수의 첫 번째 인자로 전달합니다.
사용할 데이터 로드
library(dplyr)
exam <- read.csv("./data/csv_exam.csv")
head(exam)
filter() : 행추출
- 데이터 프레임에서 특정 조건을 만족하는 행을 선택할 때 사용합니다.
- 조건을 지정하여 원하는 데이터만 추출할 수 있습니다.
# 같다
exam %>% filter(class==1)
# 같지 않다
exam %>% filter(class!=5)
# 크다 = 초과
exam %>% filter(math>80)
# 크거나 같다 = 이상
exam %>% filter(math>=90)
# 작다 = 미만
exam %>% filter(english<68)
# 작거나 같다 = 이하
exam %>% filter(english<=68)
조건을 여러개 넣을 수도 있음
# and = 교집합 / or 합집합
# and = 모든 조건을 만족하는 경우'
exam %>% filter(class==2 & science >60)
# or = 조건 중 하나라도 만족하는 경우
exam %>%filter(math >=90 | english >=80)
# or 조건을 여러개 사용
exam %>% filter(class==1|class==2|class==3)
exam %>% filter(class %in% c(1,3,5))
or 조건이 여러개일때는 %in%을 사용해서 코드를 조금 더 간편하게 만들 수 있다
# 숫자 뿐만 아니라 문자도 가능함
car <- mpg %>% filter(manufacturer %in% c("chevroelt","ford","honda"))
- 제조사가 chevroelt, ford, hond인 행 추출
select() : 열추출
- 데이터 프레임에서 특정 열을 선택할 때 사용합니다.
- 필요한 변수만 추출하여 새로운 데이터 프레임을 만들 수 있습니다.
# 변수 하나 추출
exam %>%
select(math) #20명에 대한 수학점수가 나옴
# 변수 여러 개 추출
exam %>%
select(math, english, science)
# 특정 변수를 제외하고 추출
exam %>%
select(-id)
특정 변수를 제외하고 싶을 때는 변수명 앞에 "-"를 붙여주면 됨
# 행과 열을 동시에 추출
exam %>%
filter(class == 3) %>%
select(science)
filter와 select를 같이 쓸 수 있음
반이 3반이고 과학점수만 추출!
arrange() : 정렬
- 데이터 프레임의 행을 특정 기준으로 정렬할 때 사용합니다.
- 오름차순(기본값) 또는 내림차순(desc)으로 정렬할 수 있습니다.
# 오름차순 = 낮은 값에서 높은 값으로 정렬
exam %>%
arrange(id)
# 내림차순 = 높은 값에서 낮은 값으로 정렬
exam %>%
arrange(desc(math))
# 변수 여러개로 정렬
exam %>%
arrange(class, science)
# class는 오름차순, 과학점수는 내림차순
exam %>%
arrange(class, desc(science))
mutate() : 변수추가
- 데이터 프레임에 새로운 변수를 추가하거나 기존 변수를 변형할 때 사용합니다.
- 복잡한 계산을 수행하여 새로운 변수를 만들어낼 수 있습니다.
# 변수 하나
exam %>%
mutate(score_sum = math + english + science)
# 변수 2개
exam %>%
mutate(score_sum = math + english + science,
score_mean = (math + english + science)/3)
# 새로 만든 변수를 바로 사용해도 됨. 더 효율적
exam %>%
mutate(score_sum = math + english + science,
score_mean = score_sum/3)
summarise() : 통계치 산출
- 데이터 프레임의 요약 통계량을 계산할 때 사용합니다.
- 평균, 합계, 최대값, 최소값 등 다양한 통계량을 계산할 수 있습니다.
- 여러 요약 통계량을 한번에 산출 할 수 있음
# 요약하기
exam %>%
summarise(math_mean = mean(math),
english_mean = mean(english),
science_mean = mean(science))
함수 | 의미 |
mean() | 평균 |
sd() | 표준편차 |
sum() | 합계 |
median() | 중앙값 |
min() | 최솟값 |
max() | 최댓값 |
n() | 빈도 |
exam %>%
group_by(class) %>% #class별로 분리
summarise(mean_math = mean(math), #math 평균
sum_math = sum(math), #math 합계
median_math= median(math), #math 중앙값
n=n()) #학생수
group_by() : 집단별로 나누기
- 데이터 프레임의 행을 특정 기준으로 그룹화할 때 사용합니다.
- 그룹화된 데이터에 대해 다양한 분석을 수행할 수 있습니다.
- group_by는 약간 summarise()와 짝꿍임 ><
# 그룹별로 요약하기
exam %>%
group_by(class) %>%
summarise(math_mean = mean(math),
english_mean = mean(english),
science_mean = mean(science))
# 다른 요약 통계량
exam %>%
group_by(class) %>%
summarise(science_mean = mean(science),
science_sum = sum(science),
science_median = median(science),
science_frequency = n())
left_join() : 데이터 합치기(열)
- 두 개의 데이터 프레임을 왼쪽 데이터 프레임 기준으로 결합할 때 사용합니다.
- 왼쪽 데이터 프레임의 모든 행이 포함되고, 오른쪽 데이터 프레임의 해당하는 행이 추가됩니다.
# 데이터 준비
data1 <- data.frame(id = c(1,2,3,4,5),
midterm = c(60,80,70,90,85))
data2 <- data.frame(id = c(1,2,3,4,5),
final = c(70,83,65,95,80))
data1;data2
# 좌우로 합치기 = 다른 열
# 왼쪽 테이블 기준으로 합치기
data <- left_join(data1, data2, by = "id")
data
id midterm final
1 1 60 70
2 2 80 83
3 3 70 65
4 4 90 95
5 5 85 80
id를 기준으로 midterm과 final 점수가 결합됨!
bind_rows() : 데이터 합치기(행)
- 여러 개의 데이터 프레임을 행 방향으로 결합할 때 사용합니다.
- 열의 구조가 동일한 데이터 프레임들을 하나의 데이터 프레임으로 만들 수 있습니다.
- bind_rows()는 rbind()와 같은 결과를 낸다 : 위아래 합치기
data1 <- data.frame(id = c(1,2,3,4,5),
test = c(60,80,70,90,85))
data2 <- data.frame(id = c(6,7,8,9,10),
test = c(70,83,65,95,80))
data <- bind_rows(data1,data2)
data
## id test
##1 1 60
##2 2 80
##3 3 70
##4 4 90
##5 5 85
##6 6 70
##7 7 83
##8 8 65
##9 9 95
##10 10 80
rbind(data1,data2)
## id test
##1 1 60
##2 2 80
##3 3 70
##4 4 90
##5 5 85
##6 6 70
##7 7 83
##8 8 65
##9 9 95
##10 10 80
cbind : 옆으로 합치기
rbind : row니까 행 > 위아래
cbind : colums이니까 열 > 좌우
# 옆으로 합치기
cbind(data1,data2)
cbind(data1,data2)
## id test id test
##1 1 60 6 70
##2 2 80 7 83
##3 3 70 8 65
##4 4 90 9 95
##5 5 85 10 80
혼자서 해보기
mpg 데이터를 이용해 분석 문제를 해결해 보세요.
• Q1. 자동차 배기량에 따라 고속도로 연비가 다른지 알아보려고 합니다. displ(배기량)이 4 이하인 자동차와 5 이상인 자동차 중 어떤 자동차의 hwy(고속도로 연비)가 평균적으로 더 높은지 알아보세요.
mpg <- as.data.frame(ggplot2::mpg) # mpg 데이터 불러오기
mpg_a <- mpg %>% filter(displ <= 4) # displ 4 이하 추출
mpg_b <- mpg %>% filter(displ >= 5) # displ 5 이상 추출
mean(mpg_a$hwy) # displ 4 이하 hwy 평균
## [1] 25.96319
mean(mpg_b$hwy) # displ 5 이상 hwy 평균
## [1] 18.07895
• Q2. 자동차 제조 회사에 따라 도시 연비가 다른지 알아보려고 합니다. "audi"와 "toyota" 중 어느 manufacturer(자동차 제조 회사)의 cty(도시 연비)가 평균적으로 더 높은지 알아보세요.
mpg_audi <- mpg %>% filter(manufacturer == "audi") # audi 추출
mpg_toyota <- mpg %>% filter(manufacturer == "toyota") # toyota 추출
mean(mpg_audi$cty) # audi의 cty 평균
## [1] 17.61111
mean(mpg_toyota$cty) # toyota의 cty 평균
## [1] 18.52941
• Q3. "chevrolet", "ford", "honda" 자동차의 고속도로 연비 평균을 알아보려고 합니다. 이 회사들의 자동차를 추출한 뒤 hwy 전체 평균을 구해보세요.
# manufacturer가 chevrolet, ford, honda에 해당하면 추출
mpg_new <- mpg %>% filter(manufacturer %in% c("chevrolet", "ford", "honda"))
mean(mpg_new$hwy)
## [1] 22.50943
• Q4. mpg 데이터의 class는 "suv", "compact" 등 자동차를 특징에 따라 일곱 종류로 분류한 변수입니다. 어떤 차종의 연비가 높은지 비교해보려고 합니다. class별 cty 평균을 구해보세요.
mpg <- as.data.frame(ggplot2::mpg) # mpg 데이터 불러오기
mpg %>%
group_by(class) %>% # class별 분리
summarise(mean_cty = mean(cty)) # cty 평균 구하기
• Q5. 앞 문제의 출력 결과는 class 값 알파벳 순으로 정렬되어 있습니다. 어떤 차종의 도시 연비가 높은지 쉽게 알아볼 수 있도록 cty 평균이 높은 순으로 정렬해 출력하세요.
mpg %>%
group_by(class) %>%
summarise(cty_mean = mean(cty)) %>%
arrange(desc(cty_mean))
• Q6. 어떤 회사 자동차의 hwy(고속도로 연비)가 가장 높은지 알아보려고 합니다. hwy 평균이 가장 높은 회사 세 곳을 출력하세요.
mpg %>%
group_by(manufacturer) %>%
summarise(hwy_mean = mean(hwy)) %>%
arrange(desc(hwy_mean)) %>%
head(3)
• Q7. 어떤 회사에서 "compact"(경차) 차종을 가장 많이 생산하는지 알아보려고 합니다. 각 회사별 "compact" 차종 수를 내림차순으로 정렬해 출력하세요.
mpg %>%
filter(class=="compact") %>%
group_by(manufacturer) %>%
summarise(count= n()) %>%
arrange(desc(count))
참고 책 : Do it! 쉽게 배우는 R 데이터 분석 - 이지스퍼블리싱
'R' 카테고리의 다른 글
R - 데이터 추출하기(dplyr : 문제 복습) (0) | 2024.07.11 |
---|---|
R 내장 함수 - 데이터 추출 (indexing) (0) | 2024.07.10 |
R 기초문법 - 변수명 수정 rename, 조건문 ifelse (0) | 2024.07.08 |
R 기초문법 - 외부데이터 가져오기, csv 파일 읽기, text 파일 읽기 (0) | 2024.07.06 |
R 기초문법 - R 데이터 타입, 구조 정리 (0) | 2024.07.06 |