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

时间:2017-08-25 14:59:33

标签: r dplyr data.table conditional na

我知道<{1}}有关filter multiple conditions的所有问题以及Q1Q2等非常全面的答案,甚至删除{{1} }} Q3Q4

但我有一个不同的问题,我如何NA values使用filter甚至dplyr函数保留data.table值和NA

作为以下示例,我希望将conditional parameters中的所有值保留为Var3 PLUS >5 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

任何有关解释的帮助都非常感谢!

2 个答案:

答案 0 :(得分:3)

我认为这会奏效。使用|表示过滤器的ordt2是预期的输出。

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))

答案 1 :(得分:2)

使用data.table,我们使用以下逻辑来过滤&#39; Var3&#39;如果是NA,则小于5且不是NA(!is.na(Var3))或(|

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),它就变得很重要了

DT[, Var3 < 5 ]
#[1]    NA    NA  TRUE FALSE  TRUE

DT[, Var3 < 5  & !is.na(Var3)]
#[1] FALSE FALSE  TRUE FALSE  TRUE