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

问题描述 投票:0回答:2

我有一个像这样的输入数据帧“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软件包。

r aggregate
2个回答
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

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
© www.soinside.com 2019 - 2024. All rights reserved.