2016-07-23 21 views
1

Ich möchte eine Teilmenge eines Datenrahmens nehmen und Beobachtungen behalten, wo nur bestimmte Spalten NA und nicht andere sind. Zum Beispiel:r Teilmenge Datenrahmen für nur bestimmte Spalten

d <- data.frame(cat=c(1, 2, NA, NA), dog=c(3, 3, NA, 1), rabbit=c(.1, .2, .3, .4), python=c(3, 3, 3, 3)) 
d 
    cat dog rabbit python 
1 1.0 3.0 0.1 3.0 
2 2.0 3.0 0.2 3.0 
3 NA NA 0.3 3.0 
4 NA 1.0 0.4 3.0 

Wie kann ich elegant nur Beobachtung 4, das heißt die einzige Beobachtung, für die cat und nur cat ist NA? Ich weiß, dass ich kann

d2 <- subset(d, is.na(cat)&!is.na(dog)&!is.na(rabbit)&!is.na(python)) 
    cat dog rabbit python 
4 NA 1.0 0.4 3.0 

, aber das ist umständlich, wenn ich viele Funktionen, z. Ich habe 20 Funktionen und ich möchte eine Teilmenge von Daten, wo nur 4 von ihnen sind NAs. Gibt es eine elegantere Möglichkeit, dies zu tun als is.na(featureOmitted) und !is.na(featureKept) für jede einzelne featureOmitted und featureKept, die ich möchte? Und wenn ich einen Datenrahmen dieser speziellen Beobachtungen habe, wie lasse ich die NA-Spalten fallen, mit denen ich den Filter angewendet habe?

Antwort

1

Wir versuchen

d[is.na(d$cat)&!rowSums(is.na(d[setdiff(names(d), "cat")])), , drop= FALSE] 
# cat dog rabbit python 
#4 NA 1 0.4  3 

Oder statt rowSums wir Reduce mit |

d[is.na(d$cat) & !Reduce(`|`, lapply(d[setdiff(names(d), "cat")], is.na)),, drop= FALSE] 

Eine kompakte Option

würde verwenden können
d[rowSums(is.na(d))==1 & is.na(d$cat),] 
Verwandte Themen