[英]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.