brunch

You can make anything
by writing

C.S.Lewis

by 쩐시 Aug 16. 2021

R 프로그래밍 - 비슷한 어문2

%in% | count&group_by

문제를 볼때 마다 어떤 구문을 사용할 지, 같은 결과가 나오는지 실험하면서

같은 결과를 가지는 R구문을 앞으로도 계속 정리해가겠습니다 :)


분명 저는 계속 까먹고 또 실수를 할거기 때문!


이번 글은 아래 두 가지 항목입니다


1. filter - %in% c() vs filter |

2. count() vs group_by

+ group_by + summarise 조건의 단수, 복수 차이



1. filter - %in% c() vs filter |


dplyr 패키지의 filter 항목은 전처리에서 없어선 안될 필수 구문입니다. 

특히 복수의 조건을 부여하여 추출할 때 두 가지 방법을 사용할 수 있습니다.


이건 비슷한 구문이라기 보다는, 다른 방법 정도가 되겠습니다 :)


* mpg 내장 데이터를 사용하였습니다


filter - | 


다양한 조건을 부여하여 원하는 행만 추출할 때  | 혹은 다양한 조건 중 하나라도 만족할 때는 & 기호를 씁니다.

그 중에서, 이번에 비교할 것은 | 입니다.


" 제조사가 audi, honda, jeep인 데이터를 유일값으로 추출하라 "


mpg %>% 

  select(manufacturer) %>% 

  unique() %>% 

  filter(manufacturer == 'audi'| manufacturer == 'honda'| manufacturer == 'jeep')


결과

이렇게 세 제조사에 해당되는 값을 뽑기 위해선, 번거롭게 ==를 반복 사용해야 합니다. 초보자인 저는 실험정신으로  아래 두 구문을 해봤는데 Error가 나오더군요 ㅎㅎ


filter(manufacturer == 'audi',  'honda', 'jeep')

filter(manufacturer == 'audi' | 'honda' | 'jeep')


 SQL이 이런면에서는 전처리가 더 간편한 것 같습니다...


filter - &in& c()


이 때 사용할 수 있는 구문은 %in% 함수 입니다.


mpg %>% 

  select(manufacturer) %>% 

  unique() %>% 

  filter(manufacturer %in% c('audi', 'honda', 'jeep'))


위의 == 반복구문을 사용한 것과 같은 결과가 나옵니다. 

일반적으로 data.frame을 만들 때 c()로 다양한 값을 묶어 주듯 

'==' 가 '%in% c()' 와 같은 문장이라고 할 수 있겠습니다.



2. count() vs group_by


* hflights 패키지의 내장데이터를 사용했습니다.


" 목적지별(Dest) 항공회수 빈도를 구하라 "


보통 ~별로 빈도를 구하는 문제에 직면했을 때, 저는 count() 와 group_by가 동시에 떠오릅니다.

둘을 같은 결과를 가지므로 같은 R 구문입니다.


위의 문제를 이 두 가지 언어로 작성하면,


count()


 hflights %>% 

  count(Dest)

이렇게 count함수를 사용하면 비교적 간단하게 Dest별 빈도 수를 구할 수 있습니다.

그러나 좀 더 다양한 조건이 필요할 경우에는 group_by + summarise 함수가 상세한 설명에 더 적합하다고 생각합니다!


group_by + summarise



group_by 와 summarise는 항상 같이 같이 쓰입니다. 위의 count와 같은 결과 값을 가지지만,

실제로 빈도수만 구해야하는 경우보다는 아래와 같이 이를 활용하거나 더 많은 정보도 같이 요하므로, summarise를 사용할 수 있는 group_by를 습관화 하는 것이 더 좋아 보입니다.( 주관,,,)


diamonds %>% 

  select(cut, color) %>%

  group_by(cut, color) %>% 

  filter(cut %in% c('Premium','Ideal'),

         color %in% c('D', 'E')) %>% 

  summarise(n = n(),

            mean_price = mean(diamonds$price))




** group_by + summarise 조건의 단수, 복수 차이


1. 단수 조건


" cut 범주별 " - group_by(cut)

아래 추출된 결과값을 보시면 범주별로 나눈 cut과 summarise에 조건을 부여한 빈도, 평균가로만 구성된 2X3 프레임을 확인하실 수 있습니다. filter에 추가로 부여한 color값은 보이지 않습니다.


2. 복수 조건


" cut 범주별 color를 분류하라 " - group_by(cut, color)

이번에는 color값이 보여야하는 조건이였습니다. filter값의 color 두가지 값도 동시에 추출되다 보니 행이 4개로 추가되었습니다.


위의 두 가지 차이를 확인하고, 상황에 맞는 값을 부여하면 되겠습니다!

작가의 이전글 R 프로그래밍 - 비슷한 어문1
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari