【问题标题】:R - How to drop rows with certain % of empty cells?R - 如何删除具有一定百分比的空单元格的行?
【发布时间】:2019-11-26 23:04:04
【问题描述】:

我有一个大数据框,想删除 20% 单元格为空的任何行。我似乎找不到有效执行此操作的代码。

【问题讨论】:

  • 如果你能找到连续缺失的数字,你可以很容易地找到百分比,所以我想像stackoverflow.com/questions/37801338/…这样的东西会很有帮助
  • 欢迎堆栈溢出。请添加使您的问题/问题完全可重现的示例数据。你的列是数字还是字符?您的数据有多少列/行?向我们提供更多信息,我们可以为您提供更好的帮助。

标签: r dataframe rows


【解决方案1】:

使用mapdplyr 你可以试试这个:

df:

df <- tibble(id = sequence(6), 
             var1 = c(NA, NA, NA, "x", "x", "X"), 
             var2 = c(NA, NA, NA, "x", "x", "X"), 
             var3 = c(NA, "Y", NA, "x", "x", "X"), 
             var4 = c(NA, NA, NA, "x", "x", "X"))

然后嵌套并计算每行中的 perc_na 并将其过滤掉:

df1 <- df %>% 
  nest(-id) %>% 
  mutate(
    perc_na = map_dbl(data, ~ sum(is.na(.x)) / ncol(.x))
  ) %>% 
  filter(perc_na <= 0.8) %>% 
  select(-perc_na) %>% 
  unnest()

【讨论】:

    【解决方案2】:

    缺乏很多信息,我想你可以在data.table的帮助下解决它。请参阅?data.table 了解更多信息。

    library(data.table)
    
    # make a reproducible example    
    set.seed(1)
    dt <- data.table(matrix(sample(c(NA, 1), 500, TRUE, prob = c(0.78, 0.22)), 
                     ncol = 50))
    

    应用一个函数来查找每行有多少个非 NA 值,将它们与允许的最大值进行比较并仅返回匹配的那些列:

    dt[, test := apply(.SD, 1, function(x) sum(!is.na(x))) > .2*50,][test == TRUE, ]
    

    【讨论】:

    • mean(!is.na(x)) &gt; 0.2替换sum(!is.na(x)) &gt; .2*50
    • 在我的示例数据中,所有值都是 1 或 NA,所以 mean 可以工作。但是,在更一般的情况下,值会有所不同,并且不会成立。
    猜你喜欢
    • 2019-08-16
    • 2011-02-18
    • 1970-01-01
    • 2021-09-27
    • 2014-05-10
    • 2019-11-27
    • 1970-01-01
    • 2021-11-18
    • 2019-01-07
    相关资源
    最近更新 更多