【问题标题】:dplyr: Filter multiple conditions with **selection NA values**dplyr:使用**选择 NA 值**过滤多个条件
【发布时间】:2018-02-03 16:08:59
【问题描述】:

我知道关于filter multiple conditions 的所有问题都有非常全面的答案,例如Q1Q2,甚至删除NA valuesQ3、@987654324 @。

但我有一个不同的问题,我如何使用dplyr 甚至data.table 函数来实现filter 以同时保留NA 值和conditional parameters

作为下面的示例,我想保留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

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

【问题讨论】:

    标签: r dplyr data.table conditional na


    【解决方案1】:

    我认为这会奏效。使用| 为过滤器指示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))
    

    【讨论】:

      【解决方案2】:

      对于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 提到的,&amp; !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
      

      【讨论】:

      • Var3 &lt; 5 | is.na(Var3)Var3 &lt;5 &amp; !is.na(Var3) | is.na(Var3)一样吗?
      • @ycw 是一样的。与 NA 打交道时我有点谨慎
      • 感谢您的解释。与NA打交道时谨慎行事确实是个好主意。
      • 你的第一行,我希望看到括号。我不知道如何评估 x &amp; y | z
      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多