[英]dplyr: Filter multiple conditions with **selection NA values**
我知道關於filter multiple conditions
的所有問題,這些filter multiple conditions
具有非常全面的答案,例如Q1 , Q2 ,甚至用於刪除NA values
Q3 , Q4 。
但是我有一個不同的問題,如何使用dplyr
甚至data.table
函數進行filter
以同時保留NA
值和conditional parameters
?
作為下面的示例,我想將Var3
所有值都Var3
為>5
PLUS NA
values
。
library(data.table)
library(dplyr)
Var1<- seq(1:5)
Var2<- c("s", "a", "d", NA, NA)
Var3<- c(NA, NA, 2, 5, 2)
Var4<- c(NA, 5, 1, 3,4)
DT <- data.table(Var1,Var2,Var3, Var4)
DT
Var1 Var2 Var3 Var4
1: 1 s NA NA
2: 2 a NA 5
3: 3 d 2 1
4: 4 NA 5 3
5: 5 NA 2 4
預期結果:
Var1 Var2 Var3 Var4
1: 1 s NA NA
2: 2 a NA 5
3: 3 d 2 1
4: 5 NA 2 4
我嘗試了以下方法,但未成功:
##Using dplyr::filter
DT %>% filter(!Var3 ==5)
Var1 Var2 Var3 Var4
1 3 d 2 1
2 5 <NA> 2 4
# or
DT %>% filter(Var3 <5 & is.na(Var3))
[1] Var1 Var2 Var3 Var4
<0 rows> (or 0-length row.names)
## using data.table
DT[DT[,.I[Var3 <5], Var1]$V1]
Var1 Var2 Var3 Var4
1: NA NA NA NA
2: NA NA NA NA
3: 3 d 2 1
4: 5 NA 2 4
如有任何解釋幫助,我們將不勝感激!
我認為這會起作用。 使用|
表示or
用於過濾器。 dt2
是預期的輸出。
library(dplyr)
Var1 <- seq(1:5)
Var2 <- c("s", "a", "d", NA, NA)
Var3 <- c(NA, NA, 2, 5, 2)
Var4 <- c(NA, 5, 1, 3, 4)
dt <- data_frame(Var1, Var2, Var3, Var4)
dt2 <- dt %>% filter(Var3 < 5 | is.na(Var3))
對於data.table
,我們使用以下邏輯過濾'Var3'小於5的行,而不是NA( !is.na(Var3)
)或( |
)(如果它是NA)
DT[(Var3 < 5& !is.na(Var3)) | is.na(Var3)]
# Var1 Var2 Var3 Var4
#1: 1 s NA NA
#2: 2 a NA 5
#3: 3 d 2 1
#4: 5 NA 2 4
如果我們需要dplyr
,只需在filter
使用相同的邏輯
DT %>%
filter((Var3 <5 & !is.na(Var3)) | is.na(Var3))
正如@ycw所提到的& !is.na(Var3)
並不需要& !is.na(Var3)
,但是如果我們刪除is.na(Var3)
,它就變得非常重要。
DT[, Var3 < 5 ]
#[1] NA NA TRUE FALSE TRUE
DT[, Var3 < 5 & !is.na(Var3)]
#[1] FALSE FALSE TRUE FALSE TRUE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.