【问题标题】:Check row-wise NA sum in R data.table检查 R data.table 中的逐行 NA 总和
【发布时间】:2020-12-23 10:30:56
【问题描述】:

问题:我想检查一行是否仅包含 data.table 对象中的 NA。 目前,我有一个依赖于apply 的实现。有没有更高效且易读的解决方案?

欢迎任何改进和想法!谢谢

dt <- data.table(
  x = c("A", "B", "C", "D"),
  y = c("true", NA, NA, "true"),
  z = c(NA, NA, "true", "true"),
  a = c(NA, NA, NA, "ha")
)

# Current Code:
idx <- apply(dt[, c(2:ncol(dt)), with = FALSE], 1, function(x) all(is.na(x)))
dt <- dt[!idx] 

# Code Attempt 1 (not so nice due to temp na_count column)
rel_cols <- names(dt)[!names(dt) %in% c("x")]
dt[, na_count := rowSums(is.na(.SD)), .SDcols = rel_cols][na_count < (ncol(dt) - 2)]

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    你可以像这样使用rowSums

    library(data.table)
    dt[rowSums(!is.na(dt[, ..rel_cols])) > 0]
    
    #   x    y    z    a
    #1: A true <NA> <NA>
    #2: C <NA> true <NA>
    #3: D true true   ha
    

    或者使用.SDcols

    dt[dt[, rowSums(!is.na(.SD)) > 0, .SDcols = rel_cols]]
    

    【讨论】:

      【解决方案2】:

      这是一个基本的 R 选项:

      library(data.table)
      
      dt[, rowSums(is.na(dt)) == ncol(dt)]
      
            x    y    z    a
      1: <NA> <NA> <NA> <NA>
      

      数据:

      dt <- data.table(
          x = c("A", NA, "C", "D"),
          y = c("true", NA, NA, "true"),
          z = c(NA, NA, "true", "true"),
          a = c(NA, NA, NA, "ha")
      )
      

      注意:我故意稍微更改了您的示例数据,使数据表的第二行全部为 NA 值,以证明答案有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-13
        • 2018-10-27
        • 2018-04-13
        • 2012-09-20
        • 2022-07-06
        • 1970-01-01
        • 2021-01-14
        • 2021-10-22
        相关资源
        最近更新 更多