我是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
希望任何人都可以提供帮助!
答案 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