brunch

You can make anything
by writing

C.S.Lewis

by 이지섭 Jan 31. 2021

R - filter함수로 조건을 만족하는 행 추출하기

filter 함수와 %>%(파이프오퍼레이터), %in%연산자

데이터 분석을 위해서는 지난한 전처리 과정을 거쳐야 한다. 이 전처리 과정에서 자주 쓰이는 함수가 바로 행(row)을 추출하는 filter()함수다. dplyr 패키지에는 데이터를 원하는 형태로 가공하는 과정에 필요한 함수들이 많이 있으니 잘 알아두자. 


내 눈에 잘생긴 데이터를 뽑아보자 

 

dplyr패키지의 핵심함수들은 다음과 같다. 

filter() - 행 추출 

select() - 열(변수) 추출 

arrange() - 정렬 

mutate() - 변수 추가 

summarise() - 통계치 산출 

group_by() - 집단별로 나누기

left_join() - 데이터 합치기(열)

bind_rows() - 데이터 합치기 

등등 



filter() 함수는 데이터의 '행'을 추출한다. 

데이터를 분석할 때는 데이터 내에 모든 변수를 활용하지는 않는다. 예를 들어 전체 자동차 데이터에서 특정 품번에 해당하는 차량의 데이터를 분석하고 싶은 경우, 전체 학생들의 데이터 중 1반 학생들의 데이터를 분석하는 경우가 그렇다. 직접 해보자. 


library(dplyr)

exam <- data.frame(class  = c(1, 1, 2, 2, 3, 3), 

                                    name = c("덕춘", "성길", "진웅", "건식", "우진", "재원"), 

                                    science = c(80, 60, 70, 90, 90, 40),

                                    math = c(100, 90, 50, 100, 60))


filter라는 함수를 사용해 1반 학생들의 데이터를 추출해보자. 

exam %>% filter(class == 1) 

  class name sciecne math

1     1 덕춘      80  100

2     1 성길      60   90

여기서 '%>%'는 pipe operator, chain operator 라고도 하며 Ctrl+Shift+M으로 입력이 가능하다. 

%>%(파이프연산자)는 앞에 있는 출력결과를 뒤에 있는 함수한테 보내주는 역할을 한다. 파이프를 이용해서 함수를 계속 연결할 수 있다. 큰 물탱크에 있는 다른 물탱크로 보내주는 수도관의 역할을 하기 때문에 파이프, 체인 오퍼레이터라고 불린다. 


반대로, 1반을 '제외'한 나머지 모두를 가져오고 싶을 경우 다음과 같이 작성한다. 

exam %>% filter(class != 1)  # != 사이 띄어쓰기를 하면 작동하지 않는다. 

  class name sciecne math

1     2 진웅      70   50

2     2 건식      90  100

3     3 우진      90   60

4     3 재원      40   70


초과, 미만, 이상, 이하 조건을 걸어 추출할 수 있다. 

수학점수가 50점을 넘는 학생들을 추출하고 싶은 경우   

exam %>% filter(math > 50)  

수학점수가 50점이 안 되는 학생들을 추출하고 싶은 경우   

exam %>% filter(math < 50)

과학점수가 80점 이상인 학생들을 추출하고 싶은 경우

exam %>% filter(science >= 80)

과학점수가 80점 이하인 학생들을 추출하고 싶은 경우

exam %>% filter(science <= 80)


여러 조건을 충족하는 행을 추출할 때는 &기호를 사용한다. 

1반이면서 수학점수가 50점 이상인 학생들 추출  

exam %>% filter(class == 1 & math >= 50)

2반이면서 과학점수가 80점 이상인 학생들 추출 

exam %>% filter(class == 2 & science>= 80)


여러 조건 중 '하나이상' 충족하는 행을 추출할 때는 '|(Shift+\)'기호를 사용한다. 

수학이 90이상이거나 과학이 90 이상인 경우 

exam %>% filter(math >= 90 | science >= 90)

과학이 90미만이거나 수학이 50미만인 경우

exam %>% filter(science >50 | math >50)


또 한 변수 안에서 여러 값을 추출하고 싶은 경우 %in%(match operator) 기호와 c함수를 연동해 사용한다. 

1, 2반 학생들을 추출하고 싶은 경우 

exam %>% filter(class %in% c(1,2))


#%in%(match operator)는 class 변수에 있는 값 - c함수 안에 있는 값을 매칭시킨 뒤 매칭이 되면 출력하는 기호다. 

  

위의 모든 코드를 통해 데이터의 행을 추출, 출력할 수 있다. 하지만 원자료는 그대로인 상태. 만약 우리가 1반학생들만 뽑아서 새로운 데이터프레임을 만들고 싶다면, 새로운 변수로 할당(assign) 해야 한다. 

class1 <- exam %>% filter(class == 1)

class2 <- exam %>% filter(class == 2)

#exam 데이터에서 class가 1인 값만 추출해서 class1 이라는 데이터를 새로 만들었다. 

#exam 데이터에서 class가 2인 값만 추출해서 class2 라는 데이터를 새로 만들었다. 


mean(class1$math)

mean(class2$math)

#1반의 수학평균, 2반의 수학평균을 구했다. 


!주의사항! 

추출한 데이터를 전체에 할당하면, 원자료에 추출한 데이터만 남게된다. 

exam <- exam %>% filter(class == 1) 

#exam에는 class1의 데이터만 남는다. 



R에서 사용하는 논리연산자와 기능 

<, 작다

<=, 작거나 같다

>, 크다

>=, 크거나 같다

==, 같다

!=, 같지 않다

|, 또는 

&, 그리고 

%in%와 c함수, 매칭 확인  




자유롭게 문제를 풀어보세요. 

1. filter()함수로 일정 조건에 따라 자유롭게 데이터를 구분해보자.
ex)고속도로 연비를 기준으로 데이터구분  


2. filter()함수로 class별 차량을 구분한 뒤 cty평균을 비교해보자. 


3. %in% 연산자를 활용해 filter()함수 구문을 작성해보자.   



※위 내용은 패스트캠퍼스 <프로젝트와 함께 배우는 R 데이터분석 올인원 패키지 Online>에서 공부한 내용을 토대로 데이터를 조금씩 변경해 작성했습니다. 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari