2017-08-25 3 views
0

Je suis au courant de la toute la question concernant la filter multiple conditions des réponses très complètes telles que Q1, Q2, ou même pour enlever NA valuesQ3, Q4.dplyr: Filtre plusieurs conditions avec ** sélection NA ** Valeurs

Mais j'ai une autre question, comment je peux faire filter en utilisant dplyr ou même data.table fonctions pour maintenir les valeurs et NA un conditional parameters?

comme exemple dans ce qui suit, je voudrais essayer de garder toutes les valeurs dans Var3 qui est >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 

Les résultats attendus:

 Var1 Var2 Var3 Var4 
    1: 1 s NA NA 
    2: 2 a NA 5 
    3: 3 d 2 1 
    4: 5 NA 2 4 

J'ai essayé, mais sans succès suivants:

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

Toute aide avec l'explication est très appréciée!

Répondre

2

Avec data.table, on utilise la logique suivante pour filtrer les lignes où 'Var3' est inférieur à 5 et pas de NA (!is.na(Var3)) ou (|) si elle est une 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 

Si nous avons besoin du dplyr, il suffit d'utiliser la même logique dans filter

DT %>% 
    filter((Var3 <5 & !is.na(Var3)) | is.na(Var3)) 

Comme @ycw mentionné le & !is.na(Var3) est pas t vraiment nécessaire, mais si on enlève le is.na(Var3), il devient important

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

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

Est 'Var3 <5 | is.na (Var3) 'identique à' Var3 <5 &! is.na (Var3) | est.na (Var3) '? – www

+0

@ycw Ce serait pareil. Je suis un peu prudent quand je fais affaire avec des NA – akrun

+1

Merci pour votre explication. C'est en effet une bonne idée d'être prudent lorsqu'il s'agit de «NA». – www

2

Je pense que cela va fonctionner. Utilisez | pour indiquer or pour les filtres. dt2 est la sortie attendue.

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