我有data.table
如下:
ID ID2 Col1 Col2 Col3 Col4
1: 1 34 423.76 234.22 234.11 123.87
2: 2 34 154.24 NA 221.23 786.43
3: 3 11 423.13 234.67 234.65 123.54
我按sum
和mean
聚合如下:
aggregated <- dt[, list(mean(Col1), mean(Col2),
sum(Col3), mean(Col4)), by="ID,ID2"]
如何忽略NA
中的Col2
,以便我不必从表中删除整行,仍然可以Col2
?
我试过了:
aggregated <- dt[, list(mean(Col1), mean(Col2),
sum(Col3), mean(Col4)),by="ID,ID2", na.rm = TRUE]
答案 0 :(得分:3)
更惯用的方法是:
dt[, lapply(.SD, mean, na.rm=TRUE), by=list(ID, ID2)]
.SD
是data.table
,代表by
中的每个dt
群组,因此我们(l)将mean
应用于每个by
内的每个列na.rm=TRUE
1}}组。 lapply
中指定的mean
参数会转发到?lapply
(请参阅 ID ID2 Col1 Col2 Col3 Col4
1: 1 34 423.76 234.22 234.11 123.87
2: 2 34 154.24 NaN 221.23 786.43
3: 3 11 423.13 234.67 234.65 123.54
)。这会产生:
NaN
请注意我们现在有mean(NA, na.rm=T)
,NaN
为NA
,如果唯一的值是mean(NA)
的平均值(与{{1相比) }})。这是您的数据的情况,因为每一行恰好也是一个组(即没有ID-ID2
的重复值),这意味着对于Col2
的第二个组,唯一的值取平均值是NA
。
这更有意义(现在仅按ID2
分组):
dt[, lapply(.SD, mean, na.rm=TRUE), by=ID2]
ID2 ID Col1 Col2 Col3 Col4
1: 34 1.5 289.00 234.22 227.67 455.15
2: 11 3.0 423.13 234.67 234.65 123.54
答案 1 :(得分:2)
您需要尝试:
aggregated <- dt[,list(mean(Col1, na.rm = TRUE), mean(Col2, na.rm = TRUE), sum(Col3, na.rm = TRUE), mean(Col4, na.rm = TRUE)),by="ID, ID2"]
希望这会有所帮助。