r仅用于某些列的子集数据帧

时间:2016-07-23 01:51:49

标签: 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.0 0.4 3.0

我如何优雅地仅获得观察4,即catcat只有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个是NA。有没有更优雅的方法来为我想要的每个is.na(featureOmitted)!is.na(featureKept)输入featureOmittedfeatureKept?一旦我有这些特定观察的数据帧,我如何删除我应用过滤器的NA列?

1 个答案:

答案 0 :(得分: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),]