2017-05-12 4 views
1

Hier ist ein Dummy-Daten:dplyr Filter mit Bedingung auf mehrere Spalten

father<- c(1, 1, 1, 1, 1) 
mother<- c(1, 1, 1, NA, NA) 
children <- c(NA, NA, 2, 5, 2) 
cousins <- c(NA, 5, 1, 1, 4) 


dataset <- data.frame(father, mother, children, cousins) 
dataset 


father mother children cousins 
1  1  NA  NA 
1  1  NA  5 
1  1  2  1 
1  NA  5  1 
1  NA  2  4 

, was ich will:

father mother children cousins 
    1  1  NA  NA 

ich tun kann, es mit:

test <- dataset %>% 
filter(father==1 & mother==1) %>% 
filter (is.na(children)) %>% 
filter (is.na(cousins)) 
test 

Meine Frage: Ich habe viele Spalten wie Großvater Onkel1, Onkel2, Onkel3 und ich möchte etwas wie das vermeiden:

filter (is.na(children)) %>% 
    filter (is.na(cousins)) %>% 
    filter (is.na(uncle1)) %>% 
    filter (is.na(uncle2)) %>% 
    filter (is.na(uncle3)) 
    and so on... 

Ich kann ich verwenden dplyr Filter zu sagen, die ganze Spalte mit na (außer Vater == 1 & Mutter == 1)

+0

ich gemacht Korrektur – Wilcar

+1

IMO sollten Sie Ihre Daten zu lange konvertieren Format (http://stackoverflow.com/questions/2185252/reshaping-data-frame-from-wide-to-long-format) –

+0

Mögliches Duplikat von http://StackOverflow.com/Questions/7381455/Filtering-a- Data-Frame-by-Werte-in-einer-Spalte – akrun

Antwort

5

Mit der Pre-Release:

> test 
    father mother children cousins 
1  1  1  NA  NA 

Sie diese Logik in der Basis R als auch anwenden kann

# > packageVersion('dplyr') 
# [1] ‘0.5.0.9004’ 
dataset %>% 
    filter(!is.na(father), !is.na(father)) %>% 
    filter_at(vars(-father, -mother), all_vars(is.na(.))) 
2

Hier ist eine Basis R-Methode unter Verwendung von zwei Reduce Funktionen und [ der Teilmenge .

keepers <- Reduce(function(x, y) x == 1 & y == 1, dataset[, 1:2]) & 
      Reduce(function(x, y) is.na(x) & is.na(y), dataset[, 3:4]) 
keepers 
[1] TRUE FALSE FALSE FALSE FALSE 

Jede Reduce nimmt fortlaufend die bereitgestellten Variablen und führt eine logische Überprüfung. Die beiden Ergebnisse sind mit einem & verbunden. Das zweite Argument der Reduce-Funktionen kann angepasst werden, um alle Variablen im data.frame, die Sie möchten, einzuschließen.

Verwenden Sie dann die logische Vektor

dataset[keepers,] 
    father mother children cousins 
1  1  1  NA  NA 
+1

Vielen Dank. Ich suche dplyr – Wilcar

4

A dplyr Lösung der Teilmenge:

test <- dataset %>% 
    filter(father==1 & mother==1 & rowSums(is.na(.[,3:4]))==2) 

Wo '2' ist die Anzahl der Spalten, die NA sein sollte.

Dies gibt:

dataset[dataset$father==1 & dataset$mother==1 & rowSums(is.na(dataset[,3:4]))==2,] 
Verwandte Themen