繁体   English   中英

dplyr:使用** select NA值**过滤多个条件

[英]dplyr: Filter multiple conditions with **selection NA values**

我知道关于filter multiple conditions的所有问题,这些filter multiple conditions具有非常全面的答案,例如Q1Q2 ,甚至用于删除NA values Q3Q4

但是我有一个不同的问题,如何使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM