当其中一个“by”列值为NA时进行聚合

时间:2018-02-28 08:41:04

标签: r aggregate

我有一个输入数据帧“testdata”,如下所示:

valX valY id
 1    2   NA
 4    5   NA
 7    8   1

如果我这样做:

aggregate(data.frame(testdata$valX, testdata$valY), by = list(id = testdata$id), FUN = mean)

我只得到id不是NA的行。

是否有人知道如何为ID为NA的所有行应用聚合?

我想得到一些像这样的结果:

 valX valY id
 2.5  3.5  NA
  7    8   1

注意:出于某些许可原因,我更倾向于使用基本R包的解决方案。

2 个答案:

答案 0 :(得分:2)

aggregate的问题在于它只保留参数by中传递的对象中的完整个案,并且没有选项可以禁用它。

我建议使用dplyrdata.table

dplyr解决方案:

library(dplyr)

testdata %>% 
  group_by(id) %>% 
  summarise_all(mean)

# A tibble: 2 x 3
     id  valX  valY
  <int> <dbl> <dbl>
1     1   7.0   8.0
2    NA   2.5   3.5

使用data.table

library(data.table)

setDT(testdata)
testdata[, lapply(.SD, mean), by = id]

   id valX valY
1: NA  2.5  3.5
2:  1  7.0  8.0

答案 1 :(得分:2)

你可以尝试

aggregate(data.frame(testdata$valX, testdata$valY), 
          by = list(replace(testdata$id, is.na(d$id), "NA")), FUN = mean)
  Group.1 d.valX d.valY
1       1    7.0    8.0
2      NA    2.5    3.5