[R] 포함되지 않는(not in) 데이터 필터링 하기 (feat. dplyr, filter)

해당 포스트에서는 R 데이터 필터링 방법 중 하나인 '포함되지 않는(not in)' 데이터 추출 방법을 설명합니다.

data-filtering-using-not-in-in-r

INTRO

R에서 원하는 데이터를 추출하려면 특정 컬럼을 선택하거나 데이터 내 값의 조건을 적용하여 추출하면 됩니다. 해당 포스트에서는 후자의 경우인, 조건을 이용해 특정 값에 해당하는 데이터 필터링 방법에 대해 설명하며, '조건에 해당하지 않는' 데이터 추출 방법을 설명합니다.

원문 출처 : [R-bloggers] How to Use “not in” operator in Filter

filter 함수 설명

아래에서는 dplyr 패키지에서 제공하는 filter() 함수를 이용하여 설명합니다. dplyr 패키지는 다양한 데이터 처리를 지원해주는 R 필수 패키지 중 하나로, 사용법은 아래와 같으며 만약 처음 접하셨다면 아래 링크에서 간단한 사용법을 확인해 보시는 것을 추천 드립니다.

[R] 데이터 필터링 10가지 방법 (feat. tidyverse)

dplyr::filter() 사용법

  • df %>% filter(col_name %in% c('value1', 'value2', 'value3', ...)) # include
  • df %>% filter(!col_name %in% c('value1', 'value2', 'value3', ...)) # exclude

값이 들어있지 않은 데이터 필터링하기

1개 컬럼 기준

이번 설명에 사용되는 데이터는 아래와 같습니다. 4개의 컬럼으로 구성된 데이터 프레임(data.frame)이며, 1개의 명목형 변수와 3개의 수치형 변수로 구성되어 있습니다.

df <-
  data.frame(
    team = c('P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8'),
    points = c(110, 120, 80, 16, 105, 185, 112, 112),
    assists = c(133, 128, 131, 139, 134, 55, 66, 135),
    rebounds = c(18, 18, 14, 13, 12, 15, 17, 12)
  )

df
  team points assists rebounds
1   P1    110     133       18
2   P2    120     128       18
3   P3     80     131       14
4   P4     16     139       13
5   P5    105     134       12
6   P6    185      55       15
7   P7    112      66       17
8   P8    112     135       12


해당 데이터에서 teamP1 또는 P2아닌 경우를 필터링 한다면 아래와 같습니다.

df %>% 
  filter(!team %in% c('P1', 'P2'))
  team points assists rebounds
1   P3     80     131       14
2   P4     16     139       13
3   P5    105     134       12
4   P6    185      55       15
5   P7    112      66       17
6   P8    112     135       12

2개 이상 컬럼 기준

이번 설명에 사용되는 데이터는 아래와 같습니다. 4개의 컬럼으로 구성된 데이터 프레임(data.frame)이며, 2개의 명목형 변수와 2개의 수치형 변수로 구성되어 있습니다.

df <-
  data.frame(
    team = c('P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8'),
    points = c('A', 'A', 'B', 'B', 'C', 'C', 'C', 'D'),
    assists = c(133, 128, 131, 139, 134, 55, 66, 135),
    rebounds = c(18, 18, 14, 13, 12, 15, 17, 12)
  )

df
team points assists rebounds
1   P1      A     133       18
2   P2      A     128       18
3   P3      B     131       14
4   P4      B     139       13
5   P5      C     134       12
6   P6      C      55       15
7   P7      C      66       17
8   P8      D     135       12


해당 데이터에서 teamP1이 아니고, pointsD아닌 경우를 필터링 한다면 아래와 같습니다.

df %>%
  filter(!team %in% c('P1') & !points %in% c('D'))
team points assists rebounds
1   P2      A     128       18
2   P3      B     131       14
3   P4      B     139       13
4   P5      C     134       12
5   P6      C      55       15
6   P7      C      66       17

마무리

R에서 데이터 필터링 방법은 상황 및 데이터에 따라 다양한 해결법이 존재(e.g. [R] 데이터 필터링 10가지 방법 (feat. tidyverse)합니다. 이번 포스트에서 설명한 dplyr 패키지의 filter() 함수는 그 중 가장 많이 사용되는 함수이며, '포함되지 않는(not in)' 조건을 이용한다면 보다 활용성을 높일 수 있습니다.


관련 링크

[1] [R] 데이터 필터링 10가지 방법 (feat. tidyverse)
[2] dplyr 패키지