仅针对特定列的r子集数据帧

仅针对特定列的r子集数据帧,r,R,我想获取数据帧的一个子集,并在只有某些列是NA而不是其他列的情况下保留观察结果。例如: 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

我想获取数据帧的一个子集,并在只有某些列是NA而不是其他列的情况下保留观察结果。例如:

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
但当我有很多功能时,这会很麻烦,例如,我有20个功能,我想要一个数据子集,其中只有4个是NAs。有没有比键入
Is.na(功能省略)
更优雅的方法呢!.na(featurekeeped)
是否为我想要的每个
feature省略
featurekeeped
?一旦我有了这些特定观察的数据帧,我如何删除我应用过滤器的NA列?

我们可以试试

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

或者,我们可以将
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),]
d[rowSums(is.na(d))==1 & is.na(d$cat),]