通过删除data.table中的NA来使用mean进行聚合

时间:2014-08-22 20:06:43

标签: r data.table

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

我按summean聚合如下:

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]

2 个答案:

答案 0 :(得分:3)

更惯用的方法是:

dt[, lapply(.SD, mean, na.rm=TRUE), by=list(ID, ID2)]

.SDdata.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)NaNNA,如果唯一的值是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"]

希望这会有所帮助。