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