在 R 中的 data.table 中分组,仅保留列中的非 NA 值

Group by in data.table in R which only keep non NA values from columns

我是 R 的新手

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

我的 table 看起来像:

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

希望大家帮帮忙!

尝试

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]

我检查了@akrun answer中的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