【问题标题】:set a threshold for complete cases to remove NA from multiple columns in R为完整案例设置阈值以从 R 中的多个列中删除 NA
【发布时间】:2020-05-15 09:56:45
【问题描述】:

对此可能有一个简单的答案,但我无法使其工作。我有一个如下所示的数据表:

df <- data.table(t = c(1, 2, 3), a = c(NA, NA, 4), b = c(NA, 4, NA), c = c(NA, 4, NA))

如何仅删除除“t”之外的所有列都有 NA 的行。由于我的数据文件很大,所以它应该很快,所以我特别想用 complete.cases 来做。我还没有找到解决这个问题的方法。

结果应该是这样的

dfRes <- data.table(t = c(2, 3), a = c(NA, 4), b = c(4, NA), c = c(4, NA))

【问题讨论】:

    标签: r data.table na


    【解决方案1】:

    我们可以使用complete.casesReduce

    library(data.table)
    df[df[, Reduce(`|`, lapply(.SD, complete.cases)), .SDcols = a:c]]
    #   t  a  b  c
    #1: 2 NA  4  4
    #2: 3  4 NA NA
    

    【讨论】:

    • 非常感谢!接受了您的答案,因为它完美地回答了这个问题,即使 Ronak 的其他解决方案与 rowSums 也很有效。谢谢你们!
    【解决方案2】:

    我们可以在"t"以外的列上使用rowSums

    library(data.table)
    
    cols <- which(names(df) != 't')
    df[rowSums(!is.na(df[, ..cols])) > 0, ]
    
    #   t  a  b  c
    #1: 2 NA  4  4
    #2: 3  4 NA NA
    

    【讨论】:

    • 对于具有大约 5 个 mio 观察值的超大数据表,它是否与 complete.cases 一样快?
    • complete.cases 用于知道哪些行没有缺失值。 rowSums 不过速度很快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2021-08-19
    • 2020-05-12
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多