我有一个输入数据帧“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包的解决方案。
答案 0 :(得分:2)
aggregate
的问题在于它只保留参数by
中传递的对象中的完整个案,并且没有选项可以禁用它。
我建议使用dplyr
或data.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