我想拍摄一个数据帧的子集并保持观察,其中只有某些列是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,即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个是NA。有没有更优雅的方法来为我想要的每个is.na(featureOmitted)
和!is.na(featureKept)
输入featureOmitted
和featureKept
?一旦我有这些特定观察的数据帧,我如何删除我应用过滤器的NA列?
答案 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),]