본문 바로가기
R

(R) 비교연산자, 논리연산자 / filter() in dplyr / near(), between(), %in%

by jangpiano 2021. 6. 13.
반응형

* 이번 포스팅에서는 dplyr 패키지에서 filter()와 이 함수를 사용할때 필수적으로 쓰이는 비교연산자와 논리연산자에 대한 설명을 하도록 하겠습니다.

dplyr 패키지에서 중심적인 역할을 하는 함수들에 대한 간략한 설명은, 아래 포스팅에서 확인하실 수 있습니다. 

https://jangpiano-science.tistory.com/135

 

(R) 데이터 전처리 dplyr 패키지 basics / select(), arrange(), filter(),mutate(), summary() / chain operator %>%

dplyr 패키지는 데이터 프레임에 대한 일반적인 데이터 전처리 및 분석을 돕는 문법입니다. 즉, 기존 데이터셋을 특정 유형의 분석, 또는 데이터 시각화에 더 적합한 형식으로 변환하기 위한 동사

jangpiano-science.tistory.com

<filter() in dplyr>

 

filter()은 데이터 프레임의 열(column)에 위치하는 변수들에 조건을 제시하고, 주어진 조건에 부합하는 데이터(row)들만 추출하는 동사입니다. 

즉, filter의 input으로는 데이터 프레임과, 변수들에 대한 조건이 있게죠.  --> filter(데이터 프레임, 변수들에 대한 조건)

 

각각의 변수에 대한 조건이 주어지면, 이 조건에 부합하는 행들만 추출하게 됩니다. 

예를들어, ggplot2 패키지에 속한 msleep 데이터의 vore 변수에 대해 filter()함수를 적용해보도록 할게요. 

install.packages("tidyverse")     #dplyr과 ggplot2를 한번에 다운로드 하는 방법 
library(tidyverse) 

str(msleep) 
#tibble[,11] [83 × 11] (S3: tbl_df/tbl/data.frame)
# $ name        : chr [1:83] "Cheetah" "Owl monkey" "Mountain beaver" "Greater short-tailed shrew" ...
# $ genus       : chr [1:83] "Acinonyx" "Aotus" "Aplodontia" "Blarina" ...
# $ vore        : chr [1:83] "carni" "omni" "herbi" "omni" ...
# $ order       : chr [1:83] "Carnivora" "Primates" "Rodentia" "Soricomorpha" ...
# $ conservation: chr [1:83] "lc" NA "nt" "lc" ...
# $ sleep_total : num [1:83] 12.1 17 14.4 14.9 4 14.4 8.7 7 10.1 3 ...
# $ sleep_rem   : num [1:83] NA 1.8 2.4 2.3 0.7 2.2 1.4 NA 2.9 NA ...
# $ sleep_cycle : num [1:83] NA NA NA 0.133 0.667 ...
# $ awake       : num [1:83] 11.9 7 9.6 9.1 20 9.6 15.3 17 13.9 21 ...
# $ brainwt     : num [1:83] NA 0.0155 NA 0.00029 0.423 NA NA NA 0.07 0.0982 ...
# $ bodywt      : num [1:83] 50 0.48 1.35 0.019 600 ...

table(msleep $ vore)            
#  carni   herbi insecti    omni 
#    19      32       5      20 

filter(msleep, vore %in% c("carni", "insecti"))     #vore 변수가 carni 혹은 insecti 인 행들만 추출
## A tibble: 24 x 11
#   name        genus    vore   order    conservation sleep_total sleep_rem sleep_cycle awake  brainwt  bodywt
#   <chr>       <chr>    <chr>  <chr>    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>   <dbl>
# 1 Cheetah     Acinonyx carni  Carnivo… lc                  12.1      NA        NA      11.9 NA        50    
# 2 Northern f… Callorh… carni  Carnivo… vu                   8.7       1.4       0.383  15.3 NA        20.5  
# 3 Dog         Canis    carni  Carnivo… domesticated        10.1       2.9       0.333  13.9  0.07     14    
# 4 Long-nosed… Dasypus  carni  Cingula… lc                  17.4       3.1       0.383   6.6  0.0108    3.5  
# 5 Big brown … Eptesic… insec… Chiropt… lc                  19.7       3.9       0.117   4.3  0.0003    0.023
# 6 Domestic c… Felis    carni  Carnivo… domesticated        12.5       3.2       0.417  11.5  0.0256    3.3  
# 7 Pilot whale Globice… carni  Cetacea  cd                   2.7       0.1      NA      21.4 NA       800    
# 8 Gray seal   Halioch… carni  Carnivo… lc                   6.2       1.5      NA      17.8  0.325    85    
# 9 Thick-tail… Lutreol… carni  Didelph… lc                  19.4       6.6      NA       4.6 NA         0.37 
#10 Little bro… Myotis   insec… Chiropt… NA                  19.9       2         0.2     4.1  0.00025   0.01 
## … with 14 more rows

filter(msleep, vore %in% c("carni", "omni"), sleep_rem > 1.87541)
## A tibble: 14 x 11
#   name           genus   vore  order    conservation sleep_total sleep_rem sleep_cycle awake  brainwt bodywt
#   <chr>          <chr>   <chr> <chr>    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>  <dbl>
# 1 Greater short… Blarina omni  Soricom… lc                  14.9       2.3       0.133   9.1  0.00029  0.019
# 2 Dog            Canis   carni Carnivo… domesticated        10.1       2.9       0.333  13.9  0.07    14    
# 3 Star-nosed mo… Condyl… omni  Soricom… lc                  10.3       2.2      NA      13.7  0.001    0.06 
# 4 African giant… Cricet… omni  Rodentia NA                   8.3       2        NA      15.7  0.0066   1    
# 5 Long-nosed ar… Dasypus carni Cingula… lc                  17.4       3.1       0.383   6.6  0.0108   3.5  
# 6 North America… Didelp… omni  Didelph… lc                  18         4.9       0.333   6    0.0063   1.7  
# 7 European hedg… Erinac… omni  Erinace… lc                  10.1       3.5       0.283  13.9  0.0035   0.77 
# 8 Domestic cat   Felis   carni Carnivo… domesticated        12.5       3.2       0.417  11.5  0.0256   3.3  
# 9 Human          Homo    omni  Primates NA                   8         1.9       1.5    16    1.32    62    
#10 Thick-tailed … Lutreo… carni Didelph… lc                  19.4       6.6      NA       4.6 NA        0.37 
#11 Pig            Sus     omni  Artioda… domesticated         9.1       2.4       0.5    14.9  0.18    86.2  
#12 Tenrec         Tenrec  omni  Afrosor… NA                  15.6       2.3      NA       8.4  0.0026   0.9  
#13 Tree shrew     Tupaia  omni  Scanden… NA                   8.9       2.6       0.233  15.1  0.0025   0.104
#14 Red fox        Vulpes  carni Carnivo… NA                   9.8       2.4       0.35   14.2  0.0504   4.23 

위의 예시에서, filter()함수에 msleep 데이터와, vore 변수에 대한 조건을 input으로 설정함으로써,  vore 변수에 대해 carni 혹은 insecti 요소를 가지는 행들만 추출해보았습니다. 위와 같이 데이터 전처리를 하면, 육식동물(carnivore)과 식충독물(insectivore)을 비교하기에 더 수월하겠죠. 

 

위에서는, %in% 라는 연산자를 사용했습니다. 이외에도, filter()에서 변수에 대해 다양한 조건을 부과하기 위해서는 비교연산자(comparison operator)와 논리연산자(logical operator)에 대한 정확한 이해가 필수적입니다. 

 

<비교연산자 - Comparison Operator>

 

관계 연산자(relational operator) 라고도 불리우는 비교연산자는 (comparison operator) 말그대로 연산자를 기준으로 양쪽에 존재하는, 두개의 피 연산자의 관계를 따져서 참(True)과 거짓값(False)을 얻는 연산자입니다. 데이터 전처리에서, 관계 연산자를 사용하게 될때는, 주어진 관계에 있어서 '참'값을 내는 행만 추출하게 되는것이죠. 

?Comparison

#Description
#Binary operators which allow the comparison of values in atomic vectors.

#Usage
#x < y
#x > y
#x <= y
#x >= y
#x == y
#x != y

 

== Equal to  : 서로 같다 
!= Not equal to  : 서로 같지 않다 
> Greater than : ~보다 크다 
< Less than : ~보다 작다 
>= Greater than or equal to : ~보다 크거나 같다 
<= Less than or equal to : ~보다 작거나 같다 

 

* 비교연산자를 사용할때 주의해야할 점 

1. == 와 = 를 혼동하지 않을것 : ==는 연산자 양쪽에 존재하는 피연산자가 같은지를 판가름 하는 연산자입니다. 

                                               : = 는 <-와 같은 역할을 하며, 객체를 할당할때 쓰게 됩니다. 

filter(msleep, vore = "carni")  
#Error: Problem with `filter()` input `..1`.
#x Input `..1` is named.
#ℹ This usually means that you've used `=` instead of `==`.
#ℹ Did you mean `vore == "carni"`?
#Run `rlang::last_error()` to see where the error occurred.

 

2. == 에 생기는 오류  --> near() 사용하기 

: 컴퓨터의 연산과 수 표현은 정확성에 한계가 있다. dplyr 패키지의 near 함수는 이러한 한계를 고려하여 완전히 동일하지 않아도 충분히 비슷하다면 TRUE를 반환한다.

 

우리는 sqrt(2)^2 는 2인것을 공공연히 압니다. 하지만, R에서의 연산에서는 다음의 연산을 진행시켰을때, sqrt(2)^2 와 2 가 같지 않다고 출력하는것을 볼 수 있습니다. 컴퓨터 연산의 정확성의 한계를 보완하기 위해 ==대신에 near()이 사용되곤 합니다.  

sqrt(2)^2
#[1] 2

sqrt(2)^2 == 2       
#[1] FALSE
near(sqrt(2)^2, 2)    #==의 한계 보완 : near()
#[1] TRUE

1/49 * 49 == 1
#[1] FALSE
near(1 / 49 * 49, 1)  #==의 한계 보완 : near()
#[1] TRUE

 

* 비교 연산자(comparison operator) filter() 적용 예시 

# 주어진 동물들의 평균 램수면 시간보다 더 오래 램수면 상태에 있는, 육식동물(carnivore)

filter(msleep, vore == "carni", sleep_rem > mean(sleep_rem, na.rm = TRUE))
## A tibble: 5 x 11
#  name          genus    vore  order      conservation sleep_total sleep_rem sleep_cycle awake brainwt bodywt
#  <chr>         <chr>    <chr> <chr>      <chr>              <dbl>     <dbl>       <dbl> <dbl>   <dbl>  <dbl>
#1 Dog           Canis    carni Carnivora  domesticated        10.1       2.9       0.333  13.9  0.07    14   
#2 Long-nosed a… Dasypus  carni Cingulata  lc                  17.4       3.1       0.383   6.6  0.0108   3.5 
#3 Domestic cat  Felis    carni Carnivora  domesticated        12.5       3.2       0.417  11.5  0.0256   3.3 
#4 Thick-tailed… Lutreol… carni Didelphim… lc                  19.4       6.6      NA       4.6 NA        0.37
#5 Red fox       Vulpes   carni Carnivora  NA                   9.8       2.4       0.35   14.2  0.0504   4.23

 

# 동물들의 온전한 수면상태 (총 수면 - 램수면)의 평균보다 많이 온전한 수면상태를 누리는 동물들 추출 
filter(msleep, (sleep_total - sleep_rem) > mean(sleep_total - sleep_rem, na.rm = TRUE))
## A tibble: 29 x 11
#   name          genus    vore  order    conservation sleep_total sleep_rem sleep_cycle awake  brainwt bodywt
#   <chr>         <chr>    <chr> <chr>    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>  <dbl>
# 1 Owl monkey    Aotus    omni  Primates NA                  17         1.8      NA       7    0.0155   0.48 
# 2 Mountain bea… Aplodon… herbi Rodentia nt                  14.4       2.4      NA       9.6 NA        1.35 
# 3 Greater shor… Blarina  omni  Soricom… lc                  14.9       2.3       0.133   9.1  0.00029  0.019
# 4 Three-toed s… Bradypus herbi Pilosa   NA                  14.4       2.2       0.767   9.6 NA        3.85 
# 5 Guinea pig    Cavis    herbi Rodentia domesticated         9.4       0.8       0.217  14.6  0.0055   0.728
# 6 Grivet        Cercopi… omni  Primates lc                  10         0.7      NA      14   NA        4.75 
# 7 Chinchilla    Chinchi… herbi Rodentia domesticated        12.5       1.5       0.117  11.5  0.0064   0.42 
# 8 Long-nosed a… Dasypus  carni Cingula… lc                  17.4       3.1       0.383   6.6  0.0108   3.5  
# 9 North Americ… Didelph… omni  Didelph… lc                  18         4.9       0.333   6    0.0063   1.7  
#10 Big brown bat Eptesic… inse… Chiropt… lc                  19.7       3.9       0.117   4.3  0.0003   0.023
## … with 19 more rows

<논리연산자 - Logical Operator>

 

불 연산(Boolean Operator) 라고도 불리는 논리연산자(logical operator)는, 하나의 조건을 구성하기 위하여 여러 개의 조건이 조합되어 쓰이는 연산자입니다. 예를들어, 'A 변수가 3 이상이고 B 변수가 5 이상인 데이터 ' 혹은 'A 변수가 3 이상이거나 혹은, B변수가 5 이상인 데이터' 등을 들 수 있습니다. 모두 두개의 조건이 '~이고' 와 ' ~이거나,혹은' 에 엮어 표현되죠. 이런 표현을 우리는 논리 연산자라고 부릅니다. 

?base::Logic

#Logical Operators
#Description
#These operators act on raw, logical and number-like vectors.
#Usage
# ! x
# x & y
# x && y
# x | y
# x || y
# xor(x, y)
# isTRUE (x)
# isFALSE(x)
! NOT (조건 만족하지 않는) 
& AND  (두 조건 모두 만족) 
| OR (두 조건 중 하나라도 만족)

* 논리 연산자 (logical operator) filter() 적용 예시 

filter(msleep, vore == "carni" | vore == "omni")
# 육식(carnivore)이거나 잡식(omnivore)동물 추출 

filter(msleep, !(vore =="carni" & sleep_rem < mean(sleep_rem, na.rm = TRUE)))
# (육식동물이면서 램수면 상태가 평균보다 높은) 그렇지 않은 동물 추출 
# 육식 동물이 아니거나 램수면상태가 평균보다 높지 않은 동물 추출 

 * 벤다이어그램 

논리 연산자가 여러번 쓰일때는, 이를 해석하기 복잡하고 실수할 확률이 커져서, 코드를 작성하며 벤다이어그램으로 차근차근 확인해보시는게 중요합니다. 

Ref. https://r4ds.had.co.nz/transform.html#dplyr-basics

 

 * 드 모르간 규칙 ( De morgan's Law) 

not (A or B) = not A and not B ! (A | B) = ! A & ! B 
not (A and B) = not A or not B ! (A & B) = ! A | ! B
# ! (A | B) = ! A & ! B 

head(filter(msleep, !(vore == "insecti"| conservation == "lc")))
## A tibble: 6 x 11
#  name          genus    vore  order     conservation sleep_total sleep_rem sleep_cycle awake brainwt  bodywt
#  <chr>         <chr>    <chr> <chr>     <chr>              <dbl>     <dbl>       <dbl> <dbl>   <dbl>   <dbl>
#1 Mountain bea… Aplodon… herbi Rodentia  nt                  14.4       2.4      NA       9.6 NA        1.35 
#2 Cow           Bos      herbi Artiodac… domesticated         4         0.7       0.667  20    0.423  600    
#3 Northern fur… Callorh… carni Carnivora vu                   8.7       1.4       0.383  15.3 NA       20.5  
#4 Dog           Canis    carni Carnivora domesticated        10.1       2.9       0.333  13.9  0.07    14    
#5 Guinea pig    Cavis    herbi Rodentia  domesticated         9.4       0.8       0.217  14.6  0.0055   0.728
#6 Chinchilla    Chinchi… herbi Rodentia  domesticated        12.5       1.5       0.117  11.5  0.0064   0.42 

head(filter(msleep, vore != "insecti", conservation != "lc"))
## A tibble: 6 x 11
#  name          genus    vore  order     conservation sleep_total sleep_rem sleep_cycle awake brainwt  bodywt
#  <chr>         <chr>    <chr> <chr>     <chr>              <dbl>     <dbl>       <dbl> <dbl>   <dbl>   <dbl>
#1 Mountain bea… Aplodon… herbi Rodentia  nt                  14.4       2.4      NA       9.6 NA        1.35 
#2 Cow           Bos      herbi Artiodac… domesticated         4         0.7       0.667  20    0.423  600    
#3 Northern fur… Callorh… carni Carnivora vu                   8.7       1.4       0.383  15.3 NA       20.5  
#4 Dog           Canis    carni Carnivora domesticated        10.1       2.9       0.333  13.9  0.07    14    
#5 Guinea pig    Cavis    herbi Rodentia  domesticated         9.4       0.8       0.217  14.6  0.0055   0.728
#6 Chinchilla    Chinchi… herbi Rodentia  domesticated        12.5       1.5       0.117  11.5  0.0064   0.42

#! (A & B) = ! A | ! B

head(filter(msleep, !(vore == "insecti" & conservation == "lc")))

## A tibble: 6 x 11
# name           genus    vore  order   conservation sleep_total sleep_rem sleep_cycle awake  brainwt  bodywt
#  <chr>          <chr>    <chr> <chr>   <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>   <dbl>
#1 Cheetah        Acinonyx carni Carniv… lc                  12.1      NA        NA      11.9 NA        50    
#2 Owl monkey     Aotus    omni  Primat… NA                  17         1.8      NA       7    0.0155    0.48 
#3 Mountain beav… Aplodon… herbi Rodent… nt                  14.4       2.4      NA       9.6 NA         1.35 
#4 Greater short… Blarina  omni  Sorico… lc                  14.9       2.3       0.133   9.1  0.00029   0.019
#5 Cow            Bos      herbi Artiod… domesticated         4         0.7       0.667  20    0.423   600    
#6 Three-toed sl… Bradypus herbi Pilosa  NA                  14.4       2.2       0.767   9.6 NA         3.85 

head(filter(msleep, (vore != "insecti" | conservation != "lc")))
## A tibble: 6 x 11
#  name           genus    vore  order   conservation sleep_total sleep_rem sleep_cycle awake  brainwt  bodywt
#  <chr>          <chr>    <chr> <chr>   <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>   <dbl>
#1 Cheetah        Acinonyx carni Carniv… lc                  12.1      NA        NA      11.9 NA        50    
#2 Owl monkey     Aotus    omni  Primat… NA                  17         1.8      NA       7    0.0155    0.48 
#3 Mountain beav… Aplodon… herbi Rodent… nt                  14.4       2.4      NA       9.6 NA         1.35 
#4 Greater short… Blarina  omni  Sorico… lc                  14.9       2.3       0.133   9.1  0.00029   0.019
#5 Cow            Bos      herbi Artiod… domesticated         4         0.7       0.667  20    0.423   600    
#6 Three-toed sl… Bradypus herbi Pilosa  NA                  14.4       2.2       0.767   9.6 NA         3.85 

 

*between(x, left, right ) : x>=left & x<=right  

이쯤에서 between()을 소개해드리고 싶네요. 

'A 와 B 사이' 를 비교 연산자와 논리 연산자로 표현하고자 하면, '변수 >= A & 변수 >=B' 이렇게 표현하게 됩니다.

그렇게 되면 변수의 이름이 길거나 복잡할 시, 두번이나 변수 이름을 써야해서 코드가 길어질 수 있어요. 

이를 방지하기 위해, between(변수 이름, A, B) 를 사용할 수 있습니다. 

filter(msleep, sleep_rem >= 1.0, sleep_rem <= 4.0) %>% head()
## A tibble: 6 x 11
#  name            genus   vore  order    conservation sleep_total sleep_rem sleep_cycle awake  brainwt bodywt
#  <chr>           <chr>   <chr> <chr>    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>  <dbl>
#1 Owl monkey      Aotus   omni  Primates NA                  17         1.8      NA       7    0.0155   0.48 
#2 Mountain beaver Aplodo… herbi Rodentia nt                  14.4       2.4      NA       9.6 NA        1.35 
#3 Greater short-… Blarina omni  Soricom… lc                  14.9       2.3       0.133   9.1  0.00029  0.019
#4 Three-toed slo… Bradyp… herbi Pilosa   NA                  14.4       2.2       0.767   9.6 NA        3.85 
#5 Northern fur s… Callor… carni Carnivo… vu                   8.7       1.4       0.383  15.3 NA       20.5  
#6 Dog             Canis   carni Carnivo… domesticated        10.1       2.9       0.333  13.9  0.07    14    

filter(msleep, between(sleep_rem, 1.0, 4.0)) %>% head()
## A tibble: 6 x 11
#  name            genus   vore  order    conservation sleep_total sleep_rem sleep_cycle awake  brainwt bodywt
#  <chr>           <chr>   <chr> <chr>    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>  <dbl>
#1 Owl monkey      Aotus   omni  Primates NA                  17         1.8      NA       7    0.0155   0.48 
#2 Mountain beaver Aplodo… herbi Rodentia nt                  14.4       2.4      NA       9.6 NA        1.35 
#3 Greater short-… Blarina omni  Soricom… lc                  14.9       2.3       0.133   9.1  0.00029  0.019
#4 Three-toed slo… Bradyp… herbi Pilosa   NA                  14.4       2.2       0.767   9.6 NA        3.85 
#5 Northern fur s… Callor… carni Carnivo… vu                   8.7       1.4       0.383  15.3 NA       20.5  
#6 Dog             Canis   carni Carnivo… domesticated        10.1       2.9       0.333  13.9  0.07    14    

filter(msleep, sleep_rem >= quantile(sleep_rem, na.rm = TRUE)[2], sleep_rem <= quantile(sleep_rem, na.rm = TRUE)[4]) %>% head()
## A tibble: 6 x 11
#  name            genus   vore  order    conservation sleep_total sleep_rem sleep_cycle awake  brainwt bodywt
#  <chr>           <chr>   <chr> <chr>    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>  <dbl>
#1 Owl monkey      Aotus   omni  Primates NA                  17         1.8      NA       7    0.0155   0.48 
#2 Mountain beaver Aplodo… herbi Rodentia nt                  14.4       2.4      NA       9.6 NA        1.35 
#3 Greater short-… Blarina omni  Soricom… lc                  14.9       2.3       0.133   9.1  0.00029  0.019
#4 Three-toed slo… Bradyp… herbi Pilosa   NA                  14.4       2.2       0.767   9.6 NA        3.85 
#5 Northern fur s… Callor… carni Carnivo… vu                   8.7       1.4       0.383  15.3 NA       20.5  
#6 Chinchilla      Chinch… herbi Rodentia domesticated        12.5       1.5       0.117  11.5  0.0064   0.42 

filter(msleep, between(sleep_rem, quantile(sleep_rem, na.rm = TRUE)[2],quantile(sleep_rem, na.rm = TRUE)[4])) %>% head()
## A tibble: 6 x 11
#  name            genus   vore  order    conservation sleep_total sleep_rem sleep_cycle awake  brainwt bodywt
#  <chr>           <chr>   <chr> <chr>    <chr>              <dbl>     <dbl>       <dbl> <dbl>    <dbl>  <dbl>
#1 Owl monkey      Aotus   omni  Primates NA                  17         1.8      NA       7    0.0155   0.48 
#2 Mountain beaver Aplodo… herbi Rodentia nt                  14.4       2.4      NA       9.6 NA        1.35 
#3 Greater short-… Blarina omni  Soricom… lc                  14.9       2.3       0.133   9.1  0.00029  0.019
#4 Three-toed slo… Bradyp… herbi Pilosa   NA                  14.4       2.2       0.767   9.6 NA        3.85 
#5 Northern fur s… Callor… carni Carnivo… vu                   8.7       1.4       0.383  15.3 NA       20.5  
#6 Chinchilla      Chinch… herbi Rodentia domesticated        12.5       1.5       0.117  11.5  0.0064   0.42 

*   x  %in% (A, B)   :  x == A | x ==B

'A 혹은 B 혹은 C' 를 비교 연산자와 논리 연산자로 표현하고자 하면, x == A | x == B | x ==C 이렇게 표현하게 됩니다.

그렇게 되면 변수의 이름이 길거나 복잡할 시, 반복해서 변수를 언급하기에 코드가 너무 길어질 수 있어요.  

이를 보완하기 위해 x %in% (A, B, C) 을 사용하면, 코드를 쉽고 간편하게 쓸 수 있습니다. 

x 가 A 혹은 B 혹은 X 에 속하는 행들만을 추출하게 되는것이죠. 

head(filter(msleep, vore %in% c("carni", "vore")), 5)
## A tibble: 5 x 11
#  name            genus     vore  order   conservation sleep_total sleep_rem sleep_cycle awake brainwt bodywt
#  <chr>           <chr>     <chr> <chr>   <chr>              <dbl>     <dbl>       <dbl> <dbl>   <dbl>  <dbl>
#1 Cheetah         Acinonyx  carni Carniv… lc                  12.1      NA        NA      11.9 NA        50  
#2 Northern fur s… Callorhi… carni Carniv… vu                   8.7       1.4       0.383  15.3 NA        20.5
#3 Dog             Canis     carni Carniv… domesticated        10.1       2.9       0.333  13.9  0.07     14  
#4 Long-nosed arm… Dasypus   carni Cingul… lc                  17.4       3.1       0.383   6.6  0.0108    3.5
#5 Domestic cat    Felis     carni Carniv… domesticated        12.5       3.2       0.417  11.5  0.0256    3.3

head(filter(msleep, vore == "carni" | vore == " vore"), 5)
## A tibble: 5 x 11
#  name            genus     vore  order   conservation sleep_total sleep_rem sleep_cycle awake brainwt bodywt
#  <chr>           <chr>     <chr> <chr>   <chr>              <dbl>     <dbl>       <dbl> <dbl>   <dbl>  <dbl>
#1 Cheetah         Acinonyx  carni Carniv… lc                  12.1      NA        NA      11.9 NA        50  
#2 Northern fur s… Callorhi… carni Carniv… vu                   8.7       1.4       0.383  15.3 NA        20.5
#3 Dog             Canis     carni Carniv… domesticated        10.1       2.9       0.333  13.9  0.07     14  
#4 Long-nosed arm… Dasypus   carni Cingul… lc                  17.4       3.1       0.383   6.6  0.0108    3.5
#5 Domestic cat    Felis     carni Carniv… domesticated        12.5       3.2       0.417  11.5  0.0256    3.3

이렇게 비교 연산자와 논리 연산자에 대한 설명과, 이와 관련된 함수들 near(), between(), 그리고 %in% 연산자까지 알아보았습니다. 

봐주셔서 감사하고, 오늘하루도 화이팅 하세요!

 

ref.

https://r4ds.had.co.nz/transform.html#dplyr-basics

 

반응형