EMDI는 지금도 개발중

R데이터분석 : 데이터 가공하기 filter, select, arrange, mutate 등 본문

IT/R 데이터분석

R데이터분석 : 데이터 가공하기 filter, select, arrange, mutate 등

EMDI 2019. 9. 17. 11:09

1. 데이터 가공하기 

* 해당 함수들도 전 글에서 사용했던 dplyr 함수입니다.

filter() : 행 추출

1) %>% 파이프 연산자 : ctrl + shift + m 단축키

ex) exam %>% filter(class == 1) #exam에서 class가 1인 경우만 추출해서 출력

filter를 이용해서 아래와 같이 출력할 수 있습니다.

그 외 쓸 수 있는 filter 조건

exam %>% filter(math > 50 & class == 1);  #& and문

exam %>% filter(math > 50 | class != 1);  #| or문

 

2) %in% 매치 연산자 

ex) exam %>% filter(class %in% c(1, 3)); #1반, 3반에 해당하면 추출

* 위와 같이 여러 수를 적용시키려면 1, 3과 같이 단순 나열이 아닌 c(1, 3)으로 입력해야한다.

논리연산자 기능 산술연산자 기능
< 작다 + 더하기
<= 작거나 같다 - 빼기
> 크다 * 곱하기
>= 크거나 같다 / 나누기
== 같다 ^, ** 제곱
!= 같지 않다 %/% 나눗셈의 몫
| 또는 %% 나눗셈의 나머지
& 그리고    
%in% 매칭 확인    

 

 

Q. mpg 데이터를 이용해서 분석문제를 해결하기

Q1) 자동차 배기량에 따라 고속도로 연비가 다른지 알아보려고 한다. displ(배기량)이 4이하인 자동차와 5이상인 자동차 중 어떤 자동차의 hwy(고속도로 연비)가 평균적으로 높은지 알아보기 단, filter()이용

 

displ(배기량)이 4이하인 자동차와 5이상인 자동차 

displ_1 <- mpg %>% filter(mpg$displ <= 4);
displ_2 <- mpg %>% filter(mpg$displ >= 5);

떤 자동차의 hwy(고속도로 연비)가 평균적으로 높은지 알아보기

mean(displ_1$hwy);  #결과값 : 25.96319
mean(displ_2$hwy);  #결과값 : 18.07895

 

Q2) 자동차 제조 회사에 다라 도시 연비가 다른지 알아보려고 한다. "audi"와 "toyota" 중 어느 manufacturer(자동차 제조회사)의 cty(도시 연비)가 평균적으로 높은지 알아보시오.

 

"audi"와 "toyota" 중 어느 manufacturer(자동차 제조회사)의 cty(도시 연비)가 평균적

audi <- mpg %>%  filter(mpg$manufacturer == "audi")
toyota <- mpg %>%  filter(mpg$manufacturer == "toyota")

mean(audi$cty)    #결과값 : 17.61111
mean(toyota$cty) #결과값 : 18.52941

 

Q3) "chevrolet", "ford", "honda" 자동차의 고속도로 연비 평균을 알아보려고 한다. 이회사들의 데이터를 추출한 뒤 hwy 전체 평균 구하시오.

 

"chevrolet", "ford", "honda" 자동차의 고속도로 연비 평균

car_avg <- mpg %>%  filter(mpg$manufacturer == c("chevrolet", "ford", "honda"));  //이건 잘못 사용한거인데 궁금함!

mean(car_avg$hwy);  #r결과값 : 22.27778

car_avg <- mpg %>%  filter(mpg$manufacturer %in% c("chevrolet", "ford", "honda")); //이게 정답

mean(car_avg$hwy);  #r결과값 : 22.50943

 

 

select() : 열(변수) 추출

1) %>% 파이프 연산자 : ctrl + shift + m 단축키

ex) exam %>% select(math) #exam에서 math 데이터만 추출

ex) exam %>% select(english, math) #복수선택 가능

exam %>% select(-math) #math 제외

 

2) filter() 함수와 같이 쓸 때

exam %>% filter(class == 1) %>%  select(math)

 

arrange() : 정렬

exam %>% arrange(id)

exam %>% arrange(math)         #asc 오름차순
exam %>% arrange(desc(math)) #desc 내림차순

 

"audi"에서 생산한 자동차 중 어떤 자동차 모델의 hwy가 높은지 알아보기

mpg %>%  filter(mpg$manufacturer == "audi") %>%  arrange(desc(hwy)) %>% head(5)

 

mutate() : 변수 추가

* 전 글에서는 파생변수를 추가할 때 df$var_temp <- df$var1 + df$var2;로 만들었는데 이번 글에서는 mutate()를 사용해서 만듭니다.

 

// 바로 exam 데이터 프레임에 변수를 만들고 그 안에 데이터를 넣는 형식

exam$total_dol <- (exam$math + exam$english + exam$science);

 

// 바로 exam 데이터 프레임에 변수 만들기 및 commit은 아니고 추가되었을 때의 형태만 보여줌

exam %>%  mutate(total_mut = math + english + science);

 

//mutate() 괄호 안에 여러 파생변수를 한번에 추가할 수 있다.

exam %>%  mutate(total_mut = math + english + science,
                 mean_mut = (math + english + science) / 3);

 

// ifesle 조건문을 가지고 패스, 패일을 구분할 수 있다.

exam %>%  mutate(science_result = ifelse(science >= 60, "pass", "fail")) %>% head(5)

 

// mutate()와 arrange()를 같이 사용하여 총점수가 제일 높은 것 순으로 5위까지 구하기

exam %>%  mutate(total_mut = math + english + science) %>%  arrange(desc(total_mut)) %>%  head(5)

 

summarise() : 통계치 산출

exam %>% summarise(mean_math = mean(math)) #결과값 : 51.36364

* summarise는 group_by()와 조합해 요약할 수 있습니다.

exam %>% group_by(class) %>% summarise(mean_math = mean(math))

함수 의미
mean() 평균
sd() 표준편차
sum() 합계
median() 중앙값
min() 최솟값
max() 최댓값
n() 빈도

 

group_by() : 집단별로 나누기

Q. mpg 데이터를 이용하여 회사별로 "suv" 자동차의 도시 및 고속도로 통합 연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력하기

 

// 틀린 답

mpg %>% 
  group_by(manufacturer) %>% 
  filter(class == "suv") %>% 
  mutate(total_ch = (cty + hwy)
         , mean_ch = mean(total_ch)) %>% 
  arrange(desc(mean_ch)) %>% 
  head(5)

 

// 수정한 정답

mpg %>% 
  group_by(manufacturer) %>% 
  filter(class == "suv") %>% 
  mutate(total_ch = (cty + hwy)/2) %>%
  summarise(mean_ch = mean(total_ch)) %>% 
  arrange(desc(mean_ch)) %>% 
  head(5)

 

가로로 합치기 vs 세로로 합치기

1) 가로로 합치기 (by 사용) left_join() : 데이터 합치기(열)

* by에 기준 변수를 지정할 때 변수명 앞뒤에 따옴표를 입력해야합니다.

 

test1 <- data.frame(id = c(1,2,3,4,5),
                    midterm = c(60,80,70,90,85))
test2 <- data.frame(id = c(1,2,3,4,5),
                    final = c(70,83,65,95,80))


total <- left_join(test1, test2, by = "id") 
# id를 기준으로 합쳐 total에 할당

 

2) 세로로 합치기 (bind_rows() 사용) bind_rows() : 데이터 합치기(행)

test3 <- data.frame(id = c(6,7,8,9),
                    midterm = c(60,70,80,90),
                    final = c(50,40,80,70))

group_all <- bind_rows(total, test3);

 

 

 

 

 

 

 

 

Comments