2016-07-23 39 views
1

我想獲取一個數據幀的子集,並在只有某些列是NA而不是其他列的情況下保留觀察值。例如:只有特定列的r子集數據幀

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 

如何優雅地只得到4觀察,即針對cat唯一的觀察,只有cat是NA?我知道我可以做

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 

但是,當我有很多功能時,這很麻煩。我有20個功能,我想要一個數據子集,其中只有4個是NAs。有沒有更好的方法來做到這一點,而不是爲我想要的每一個featureOmittedfeatureKept輸入is.na(featureOmitted)!is.na(featureKept)?一旦我得到了這些特定觀察的數據框,我該如何刪除應用過濾器的NA列?

回答

1

我們可以嘗試

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 

或代替rowSums,我們可以使用Reduce|

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

緊湊的辦法是

d[rowSums(is.na(d))==1 & is.na(d$cat),]