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

时间:2015-03-27 03:58:57

标签: r group-by data.table

我是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

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

2 个答案:

答案 0 :(得分:3)

尝试

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]

答案 1 :(得分:3)

我在@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