✏️

221125 | R 데이터 분석 / filter() / select() / arrange() 본문

K-Digital Training

221125 | R 데이터 분석 / filter() / select() / arrange()

콩세 2022. 11. 28. 08:11

filter() : 행 추출하기

## 1) filter() : 행 추출하기 ----

# class가 6인 경우
my_ss %>%
  filter(class == 6)

# class가 2와 3인 경우
my_ss %>%
  filter(class == 2 | class == 3)

# class가 2와 3이 아닌 경우
my_ss %>%
  filter(class != 2 & class != 3) %>%
  pull(class)                              # vector return

my_ss %>%
  filter(class != 2 & class != 3) %>%
  select(class)                            # df return

# java가 80점 이상이면서 class가 3인 경우
my_ss %>%
  filter(java >= 80 & class == 3) %>%
  head()

# java 또는 eng가 80점 이상이면서 class가 5인 경우
my_ss %>%
  filter(java | eng >= 80, class == 5) %>%
  select(java, eng, class)

my_ss %>%
  filter(java >= 80 | eng >= 80, class == 5)

# class가 1,3,5인 경우
my_ss %>%
  filter(class == 1 | class == 3 | class == 5)

my_ss %>%
  filter(class %in% c(1,3,5)) %>%
  select(class) %>% unique()

select() : 열 추출하기

## 2) select() 열 추출하기 ----

# id와 database 출력
select(my_ss, id, database)  # 방법1 : (변수명,조회할 컬럼명1, 컬럼명2, ...)

names(my_ss)
my_ss %>%
  select(id, database)       # 방법2

# 모든 컬럼 조회
my_ss %>%
  select(everything())

# eng와 database 빼고
my_ss %>%
  select(-eng, -database) %>% head(3)

# class가 2인 학생들의 java와 db성적
my_ss %>%
  filter(class == 2) %>%
  select(class, java, database)

Q. 예제1

# Q.
# gglot2::mpg를 활용하여 아래 내용을 분석하세요.
# 조건1. 배기량별 고속도로 연비 displ(배기량)이 5~6인 자동차의 hwy(고속도로 연비)의 평균
# 조건2. hyundai와 lincoln 제조사(manufacturer)의 도시연비(cty) 평균비교

search()
library(ggplot2)

my_mpg <- ggplot2::mpg
names(my_mpg)

# 1)
my_t1 <- my_mpg %>%
  select(1:3, hwy) %>%                  # 컬럼 1번부터 3번 + hwy도. 총 4개 컬럼 보여주라는 뜻.
  filter(between(displ,5,6))

names(my_t1)                            # 위에서 select로 선택한 컬럼들 이름 보여줌.
mean(my_t1$hwy)



# 2) 방법1
unique(my_mpg$manufacturer)             # 제조사명 하나씩만 보여주는.
names(my_mpg)                           # my_mpg의 모든 컬럼명 보여주는.

my_mpg %>%
  filter(manufacturer %in%
           c("lincoln","hyundai")) %>%  # 제조사명이 링컨 현대에 포함되면
  select(1,8) %>%                       # 컬럼명 1번:manufacturer / 8번:cty 열만 보여줘라.
  group_by(manufacturer) %>%            # 전체 하나의 평균이 아닌 각자의 평균을 구하기 위한 과정.
  summarise(m_cty = mean(cty))



# 2) 방법2 : 변수를 만들어서 각각 평균을 구하는 방법
avg2 <- mpg_d %>%
  filter(manufacturer == "hyundai")

avg3 <- mpg_d %>%
  filter(manufacturer == "lincoln")

mean(avg2$cty)
mean(avg3$cty)



# 3) jeep, land rover, dodge 평균-hwy
# 3개 차종 전체 평균 구하기
unique(my_mpg$manufacturer)
names(my_mpg)

mean((my_mpg %>%
  filter(manufacturer %in%
           c("jeep", "land rover", "dodge")))$hwy)


my_mpg %>%
  filter(manufacturer %in%
           c("jeep", "land rover", "dodge")) %>%
  summarise(m_hwy = mean(hwy))

# 3개 차종, 각각의 평균
my_mpg %>%
  filter(manufacturer %in%
           c("jeep", "land rover", "dodge")) %>%
  group_by(manufacturer) %>%
  summarise(mean_hwy = mean(hwy))

Q. 예제2

# Q.
# ggplot2::mpg를 활용하여 아래 내용을 확인하시오.
# 1. mpg dataset의 아래 변수만 복사하여 new dataset을 생성하시오.
#+ manufacturer(제조사), class(자동차 종류), cty(도시연비)

# 2. 1번 dataset에서 class(자동차종류)간의 평균 cty(도시연비)를 추출하시오
#+ 비교대상 class: pickup, suv

# 1)
my_mpg
names(my_mpg)

my_mpg2 <- my_mpg %>%                              # 새 dataset 이름 : my_mpg2
  select(1,8,11)
View(my_mpg2)

# 2)
my_mpg2 %>%
  filter(class %in% c("pickup", "suv")) %>%        # suv랑 pickup만 뽑아내기.
  group_by(class) %>%
  summarise(mean_cty=mean(cty))

# summarise 사용x
avg4 <- my_mpg2 %>%
  filter(class == "pickup")

avg5 <- my_mpg2 %>%
  filter(class == "suv")

mean(avg4$cty)
mean(avg5$cty)



# 교수님 답
# pickup, suv
unique(my_mpg2$class)

# Q2-1 dplyr + summarise() 사용o
my_mpg2 %>%
  filter(class %in% c("suv", "pickup")) %>%
  summarise(mean(cty))

# Q2-2 dplyr + summarise() 사용x
names(mpg2)

(my_mpg2 %>%
    filter(class %in% c("suv", "pickup")))$cty

mean((my_mpg2 %>%
        filter(class %in% c("suv", "pickup")))$cty)

# Q2-3 group by + dplyr::
my_mpg2 %>%
  filter(class %in% c("suv", "pickup")) %>%
  group_by(class) %>%
  summarise(mean(cty))

# Q2-4 group by + SQL

library(sqldf)
names(my_mpg2)
my_sql <- sqldf("
      
      select class, avg(cty) as avg_hwy
      from my_mpg2
      where class in ('suv', 'pickup')
      group by class
      
      ")

my_sql

arrange()

## 3) arrange() ----
#+ SQL : order by

my_exam2 <- read.csv("dts/ss_exam.csv")

# class와 eng 정렬 (오름)
names(my_exam2)
head(my_exam2)
ls()

unique(my_exam2$id) %>% length()
unique(my_exam2$class) %>% length()

my_exam2 %>%
  arrange(class, eng) %>%
  select(class,eng)


# class(내림)와 eng 정렬(오름)
#+ desc(변수명), -숫자변수명

my_exam2 %>%
  arrange(-class, eng) %>%
  select(class,eng)

Q. 예제3

# Q.
# ggplot2::mpg 를 활용하여 다음 요청내용을 출력하세요.
# library: ggplot2, dplyr

search()

# 1) hyundai 차량 중, hwy(고속도로 연비)가 높은 순으로 출력하세요.

my_mpg <- ggplot2::mpg
View(my_mpg)
names(my_mpg)

my_mpg %>%
  filter(manufacturer == "hyundai") %>%            # 현대 차량만.
  arrange(-hwy) %>%                                # 내림차순 정렬. (큰수부터.)
  View()

# 2) hyundai 차량 중, hwy가 높은 순위(1~3위)에 해당하는 자동차 정보를 출력하세요.
my_mpg  %>%
  filter(manufacturer == "hyundai") %>%
  arrange(-hwy) %>%
  head(3) %>%
  View()