【问题标题】:Group by in data.table in R which only keep non NA values from columns在 R 中的 data.table 中分组,仅保留列中的非 NA 值
【发布时间】:2015-03-27 03:58:56
【问题描述】:

我是 R 新手。

我想按 data.table 分组,只保留列中的非 NA 值。

我的桌子是这样的:

c1   c2   c3   c4
1    A    NA   NA
1    NA   B    NA
1    NA   NA   C
2    A1   NA   NA
2    NA   B1   NA
2    NA   NA   C1

我想要一个结果:

c1   c2   c3   c4
1    A    B    C
2    A1   B1   C1

希望任何人都可以提供帮助!

【问题讨论】:

    标签: r group-by data.table


    【解决方案1】:

    试试

    library(data.table)
    setDT(df1)[, lapply(.SD, na.omit) , by = c1]
    #    c1 c2 c3 c4
    #1:  1  A  B  C
    #2:  2 A1 B1 C1
    

    或者

    setDT(df)[, lapply(.SD, function(x) x[!is.na(x)]) , by = c1]
    

    【讨论】:

      【解决方案2】:

      我在@akrun 答案中检查了 2 种方法,发现方法 2 更好。

      更新:我还添加了使用complete.cases 作为@akrun 建议的函数。

       f1 <- function (d) d[, lapply(.SD, na.omit) , by = c1]
       f2 <- function (d) d[, lapply(.SD, function(x) x[!is.na(x)]) , by = c1]
       f3 <- function (d) d[, lapply(.SD, function(x) x[complete.cases(x)]), by = c1]
      
       microbenchmark(f1(copy(dt2)), f2(copy(dt2)), f3(copy(dt2)))
      
      
      #Unit: milliseconds
      #          expr       min        lq      mean    median        uq       max neval
      # f1(copy(dt2)) 124.22661 132.84712 138.00615 135.48418 140.18581 222.20735   100
      # f2(copy(dt2))  14.47915  16.37986  18.15728  17.35153  18.38754  28.72007   100
      # f3(copy(dt2))  22.10803  24.43208  27.63959  26.18713  31.58418  39.31601   100
      

      【讨论】:

      • 你也可以试试complete.cases。通常,它会更快。
      • 稍后我会尝试complete.cases 并更新我的帖子。感谢您的帮助!
      • 试过complete.cases,但不如is.na :)
      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      相关资源
      最近更新 更多