【问题标题】:r subset dataframe for only certain columnsr 仅针对某些列的子集数据框
【发布时间】:2016-07-23 01:51:49
【问题描述】:

我想获取数据框的一个子集,并在只有某些列是 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。有没有比为我想要的每个featureOmittedfeatureKept 输入is.na(featureOmitted)!is.na(featureKept) 更优雅的方法?一旦我有了这些特定观察的数据框,如何删除我应用过滤器的 NA 列?

【问题讨论】:

    标签: r


    【解决方案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),]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多