2017-08-25 100 views
0

我知道的所有方面问题时filter multiple conditions具有非常全面的解答,如Q1Q2,甚至去除NA valuesQ3,​​。dplyr:筛选多个条件与**选择NA值**

但是我有一个不同的问题,我怎样才能使用dplyr甚至data.table功能,以保持两者NA值和conditional parametersfilter

如下面我想保持所有值的Var3这是>5PLUSNAvalues一个例子。

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 

与解释任何帮助,不胜感激!

回答

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提到& !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 
+0

是'Var3 <5 | is.na(Var3)'与Var3 <5&!is.na(Var3)|相同is.na(VAR3)'? – www

+0

@ycw这将是相同的。在处理新手时,我有点谨慎 – akrun

+1

感谢您的解释。处理“NA”时谨慎是一个好主意。 – www

2

。使用|表示过滤器的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))