2017-08-25 73 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))