R中data.table中的Group by,它只保留列中的非NA值
我是R的新手 我想按data.table分组,只保留列中的非NA值 我的桌子看起来像:R中data.table中的Group by,它只保留列中的非NA值,r,group-by,data.table,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 希望任何人都能帮忙 试试看 lib
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
或
我检查了@akrun answer中的两种方法,发现方法2更好 更新:我还添加了使用
complete.cases
作为@akrun建议的函数
f1您是否也可以尝试complete.cases
。通常情况下,它会更快。我会稍后尝试完成。案例
,并更新我的帖子。谢谢你的帮助!它已经尝试了完成.cases
,但不如那么好。na
:)
setDT(df)[, lapply(.SD, function(x) x[!is.na(x)]) , by = c1]
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