【问题标题】:Remove Column if all values are either NA or 0 in r [duplicate]如果 r 中的所有值都是 NA 或 0,则删除 Column [重复]
【发布时间】:2019-05-11 13:41:43
【问题描述】:

有谁知道如何删除完全由 NA 或零组成的列?

例如,给定这样的数据框:

  rv    X1   X2    X3  X4 
1 M     0    110   0   1
2 J     70   200   0   3
3 J     NA   115   NA  4
4 M     65   110   0   9
5 J     70   200   NA  3
6 J     64   115   NA  8

我只想要 rv、X1、X2 和 X4 列。

【问题讨论】:

  • 提示:1. 对列运行测试,查看“所有”条目是否为 0 或 NA,2. 删除这些列。这两个步骤的答案都可以在 Stack 上找到。

标签: r dataframe


【解决方案1】:

有了base R,我们可以做到

Filter(function(x) !all(is.na(x)|x == 0), df)
#  rv X1  X2 X4
#1  M  0 110  1
#2  J 70 200  3
#3  J NA 115  4
#4  M 65 110  9
#5  J 70 200  3
#6  J 64 115  8

或使用colSums

df[!!colSums(replace(df, is.na(df), 0)!= 0)]

或者使用sapply创建逻辑向量

df[!sapply(df, function(x) all(is.na(x)|x == 0))]

【讨论】:

    【解决方案2】:

    有多种方法可以做到这一点

    df[colSums(is.na(df) | df == 0) != nrow(df)]
    
    #  rv X1  X2 X4
    #1  M  0 110  1
    #2  J 70 200  3
    #3  J NA 115  4
    #4  M 65 110  9
    #5  J 70 200  3
    #6  J 64 115  8
    

    使用apply

    df[!apply(is.na(df) | df == 0, 2, all)]
    

    或者使用dplyr

    library(dplyr)
    df %>%  select_if(~!all(is.na(.) | . == 0))
    

    【讨论】:

      【解决方案3】:

      测试一列的一种方法是:

      (sum(is.na(df$X1)) + sum(df$X1 == 0))  == nrow(df)
      

      X1 是列名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 2018-10-21
        • 2022-11-23
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 2022-12-12
        相关资源
        最近更新 更多