【问题标题】:How to remove columns with more than 90% values as '0' in R如何在R中删除具有超过90%值的列作为'0'
【发布时间】:2019-05-18 14:44:15
【问题描述】:

我有分类变量,我将其转换为虚拟变量并得到超过 2381 个变量。我不需要那么多变量进行分析(比如回归或相关性)。如果给定列中超过 90% 的总值是“0”,我想删除列。此外,除了 90% 的值是 '0' 之外,是否有一个很好的指标来删除列?救命!

【问题讨论】:

标签: r if-statement logic dummy-variable


【解决方案1】:

这将为您提供一个data.frame,其中没有超过 90% 的元素为 0 的列:

df[sapply(df, function(x) mean(x == 0) <= 0.9)]

或者更优雅,正如 markus 所暗示的那样:

df[colMeans(df == 0) <= 0.9]

【讨论】:

    【解决方案2】:

    这很容易用colSums:

    示例数据:

    df <- data.frame(x = c(rep(0, 9), 1),
                     y = c(rep(0,9), 1),
                     z = c(rep(0, 8), 1, 1))
    
    > df
       x y z
    1  0 0 0
    2  0 0 0
    3  0 0 0
    4  0 0 0
    5  0 0 0
    6  0 0 0
    7  0 0 0
    8  0 0 0
    9  0 0 1
    10 1 1 1
    
    df[, colSums(df == 0)/nrow(df) < .9, drop = FALSE]
       z
    1  0
    2  0
    3  0
    4  0
    5  0
    6  0
    7  0
    8  0
    9  1
    10 1
    

    关于有用指标的问题,这在很大程度上取决于您要分析的内容。即使是具有 90% 以上0 值的列也可能对回归模型有用。我会查看变量的内容,或者使用基于 AIC 或 BIC 的逐步排除来衡量变量的相关性。

    【讨论】:

      【解决方案3】:

      嘿, 我用dplyr 包写了一些代码。下面是一些示例,您可以如何去除其中包含 90% 以上的零的列:

      library(dplyr)
      
      df <- data.frame(colA=sample(c(0,1), 100, replace=TRUE, prob=c(0.8,02)),
                       colB=sample(c(0,1), 100, replace=TRUE, prob=c(0.99,001)),
                       colC=sample(c(0,1), 100, replace=TRUE, prob=c(0.5,05)),
                       colD=sample(c(0,1), 100, replace=TRUE, prob=c(0,1)),
                       colE=rep(0, 100))
      
      fct <- function (x) x==0
      
      zero_count <- df %>% mutate_all(funs(fct)) %>% summarise_all(sum)
      
      col_filter <- zero_count <= 0.9 * nrow(df)
      
      df_filter <- df[, col_filter]
      

      【讨论】:

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