본문 바로가기
R

R dplyr 패키지 이용하기 - %>% 파이프라인 연산자

by d22pinsights 2024. 7. 8.

파이프라인 연산자 %>%  : 단축키는 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 데이터 분석 - 이지스퍼블리싱