* 이번 포스팅에서는 dplyr 패키지에서 filter()와 이 함수를 사용할때 필수적으로 쓰이는 비교연산자와 논리연산자에 대한 설명을 하도록 하겠습니다.
dplyr 패키지에서 중심적인 역할을 하는 함수들에 대한 간략한 설명은, 아래 포스팅에서 확인하실 수 있습니다.
https://jangpiano-science.tistory.com/135
<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)))
# (육식동물이면서 램수면 상태가 평균보다 높은) 그렇지 않은 동물 추출
# 육식 동물이 아니거나 램수면상태가 평균보다 높지 않은 동물 추출
* 벤다이어그램
논리 연산자가 여러번 쓰일때는, 이를 해석하기 복잡하고 실수할 확률이 커져서, 코드를 작성하며 벤다이어그램으로 차근차근 확인해보시는게 중요합니다.
* 드 모르간 규칙 ( 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