2016-07-23 5 views
1

Я хотел бы взять подмножество кадра данных и хранить наблюдения, где только определенные столбцы являются NA, а не другими. Например:r подмножество dataframe только для определенных столбцов

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 из них являются НС. Есть ли более элегантный способ сделать это, чем набирать is.na(featureOmitted) и !is.na(featureKept) для каждых featureOmitted и 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),] 
Смежные вопросы