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

해당 포스트는 R에서 tidyverse 패키지를 이용하여 데이터 필터링하는 방법을 코드와 함께 소개하는 글입니다.

1. INTRO

데이터 프레임(Data Frame)은 R에서 가장 많이 사용하는 자료 구조입니다. 분석을 위해 데이터를 추출하거나 필터링하는 경우, 내장 함수만으로도 처리 가능하지만 tidyverse 패키지(정확히는 tidyverse 패키지에 포함된 dplyr 패키지)를 이용하면 좀 더 직관적이고 효과적인 처리가 가능해 집니다.

R 내장 데이터셋인 msleep을 이용해 코드와 함께 설명하겠습니다.

패키지 불러오기

library(tidyverse)
head(msleep)
# A tibble: 6 x 11
  name                       genus      vore  order        conservation sleep_total sleep_rem sleep_cycle awake  brainwt  bodywt
                                                                         
1 Cheetah                    Acinonyx   carni Carnivora    lc                  12.1      NA        NA      11.9 NA        50    
2 Owl monkey                 Aotus      omni  Primates     NA                  17         1.8      NA       7    0.0155    0.48 
3 Mountain beaver            Aplodontia herbi Rodentia     nt                  14.4       2.4      NA       9.6 NA         1.35 
4 Greater short-tailed shrew Blarina    omni  Soricomorpha lc                  14.9       2.3       0.133   9.1  0.00029   0.019
5 Cow                        Bos        herbi Artiodactyla domesticated         4         0.7       0.667  20    0.423   600    
6 Three-toed sloth           Bradypus   herbi Pilosa       NA                  14.4       2.2       0.767   9.6 NA         3.85 

2. 데이터 필터링 방법 10가지

Example 1

  1. msleep 데이터에서 name, sleep_total 컬럼 추출
  2. sleep_total 값이 15 이상인 행 출력

R코드 및 출력 결과

data1 <- msleep %>%
  select(name, sleep_total) %>%
  filter(sleep_total > 15)
data1
# A tibble: 12 x 2
   name                           sleep_total
                                   
 1 Owl monkey                            17  
 2 Long-nosed armadillo                  17.4
 3 North American Opossum                18  
 4 Big brown bat                         19.7
 5 Thick-tailed opposum                  19.4
 6 Little brown bat                      19.9
 7 Tiger                                 15.8
 8 Giant armadillo                       18.1
 9 Arctic ground squirrel                16.6
10 Golden-mantled ground squirrel        15.9
11 Eastern american chipmunk             15.8
12 Tenrec                                15.6

Example 2

  1. msleep 데이터에서 name, sleep_total 컬럼 추출
  2. sleep_total 값이 15 이상인 아닌 행 출력

R코드 및 출력 결과

data2 <- msleep %>%
  select(name, sleep_total) %>%
  filter(!sleep_total > 15)
data2
# A tibble: 71 x 2
   name                       sleep_total
                               
 1 Cheetah                           12.1
 2 Mountain beaver                   14.4
 3 Greater short-tailed shrew        14.9
 4 Cow                                4  
 5 Three-toed sloth                  14.4
 6 Northern fur seal                  8.7
 7 Vesper mouse                       7  
 8 Dog                               10.1
 9 Roe deer                           3  
10 Goat                               5.3
# ... with 61 more rows

Example 3

  1. msleep 데이터에서 name, order, bodywt, sleep_total 컬럼 추출
  2. order 값이 'Primates' 이고, bodywt 값이 15를 초과하는 행 출력

R코드 및 출력 결과

data3 <- msleep %>%
  select(name, order, bodywt, sleep_total) %>%
  filter(order == "Primates", bodywt > 15)
data3
# A tibble: 3 x 4
  name       order    bodywt sleep_total
                    
1 Human      Primates   62           8  
2 Chimpanzee Primates   52.2         9.7
3 Baboon     Primates   25.2         9.4

Example 4

  1. msleep 데이터에서 name, order, bodywt, sleep_total 컬럼 추출
  2. order 값이 'Primates' 이거나, bodywt 값이 15를 초과하는 행 출력

R코드 및 출력 결과

data4 <- msleep %>%
  select(name, order, bodywt, sleep_total) %>%
  filter(order == "Primates" | bodywt > 15)
data4
# A tibble: 33 x 4
   name              order           bodywt sleep_total
                                   
 1 Cheetah           Carnivora        50           12.1
 2 Owl monkey        Primates          0.48        17  
 3 Cow               Artiodactyla    600            4  
 4 Northern fur seal Carnivora        20.5          8.7
 5 Goat              Artiodactyla     33.5          5.3
 6 Grivet            Primates          4.75        10  
 7 Asian elephant    Proboscidea    2547            3.9
 8 Horse             Perissodactyla  521            2.9
 9 Donkey            Perissodactyla  187            3.1
10 Patas monkey      Primates         10           10.9
# ... with 23 more rows

Example 5

  1. msleep 데이터에서 name, sleep_total 컬럼 추출
  2. name 값이 'Cow' 또는 'Dog' 또는 'Goat' 인 행 출력

R코드 및 출력 결과

data5 <- msleep %>%
  select(name, sleep_total) %>%
  filter(name == "Cow" |
           name == "Dog" |
           name == "Goat")
data5
# A tibble: 3 x 2
  name  sleep_total
         
1 Cow           4  
2 Dog          10.1
3 Goat          5.3

Example 6

  1. msleep 데이터에서 name, sleep_total 컬럼 추출
  2. name 값 중에 c('Cow','Dog','Goat') 벡터에 속하는 행 추출 (Example 5와 같은 의미)

R코드 및 출력 결과

data6 <- msleep %>%
  select(name, sleep_total) %>%
  filter(name %in% c("Cow", "Dog", "Goat"))
data6
# A tibble: 3 x 2
  name  sleep_total
         
1 Cow           4  
2 Dog          10.1
3 Goat          5.3

Example 7

  1. msleep 데이터에서 name, sleep_total 컬럼 추출
  2. sleep_total 값이 16 에서 18 사이인 행 추출

R코드 및 출력 결과

data7 <- msleep %>%
  select(name, sleep_total) %>%
  filter(between(sleep_total, 16, 18))
data7
# A tibble: 4 x 2
  name                   sleep_total
                          
1 Owl monkey                    17  
2 Long-nosed armadillo          17.4
3 North American Opossum        18  
4 Arctic ground squirrel        16.6

Example 8

  1. msleep 데이터에서 name, sleep_total 컬럼 추출
  2. sleep_total 값이 17 근처인 행 추출 (편차 = 0.5)

R코드 및 출력 결과

data8 <- msleep %>%
  select(name, sleep_total) %>%
  filter(near(sleep_total, 17, tol = 0.5))
data8
# A tibble: 3 x 2
  name                   sleep_total
                          
1 Owl monkey                    17  
2 Long-nosed armadillo          17.4
3 Arctic ground squirrel        16.6

Example 9

  1. msleep 데이터에서 name, conservation, sleep_total 컬럼 추출
  2. conservation 값이 NA인 행 추출

R코드 및 출력 결과

data9 <- msleep %>%
  select(name, conservation, sleep_total) %>%
  filter(is.na(conservation))
data9
# A tibble: 29 x 3
   name                        conservation sleep_total
                                        
 1 "Owl monkey"                NA                  17  
 2 "Three-toed sloth"          NA                  14.4
 3 "Vesper mouse"              NA                   7  
 4 "African giant pouched rat" NA                   8.3
 5 "Western american chipmunk" NA                  14.9
 6 "Galago"                    NA                   9.8
 7 "Human"                     NA                   8  
 8 "Macaque"                   NA                  10.1
 9 "Vole "                     NA                  12.8
10 "Little brown bat"          NA                  19.9
# ... with 19 more rows

Example 10

  1. msleep 데이터에서 name, conservation, sleep_total 컬럼 추출
  2. conservation 값이 NA가 아닌 행 추출

R코드 및 출력 결과

data10 <- msleep %>%
  select(name, conservation, sleep_total) %>%
  filter(!is.na(conservation))
data10
# A tibble: 54 x 3
   name                       conservation sleep_total
                                       
 1 Cheetah                    lc                  12.1
 2 Mountain beaver            nt                  14.4
 3 Greater short-tailed shrew lc                  14.9
 4 Cow                        domesticated         4  
 5 Northern fur seal          vu                   8.7
 6 Dog                        domesticated        10.1
 7 Roe deer                   lc                   3  
 8 Goat                       lc                   5.3
 9 Guinea pig                 domesticated         9.4
10 Grivet                     lc                  10  
# ... with 44 more rows

3. 관련 링크

[1] [R-bloggers] Filtering Data in R 10 Tips -tidyverse package
[2] [RDocumentation] dplr::near - Compare two numeric vectors


banner-request-analysis