Другие ответы, похоже, уже решают проблему, но я хотел предложить data.table
решение. Спасибо @JMilner за образец данных.
library(data.table)
rm(list = ls())
df <- data.table(data.frame(
id = c(1, 2, 3, 4, 5, 6, 7),
test1 = c(9, 8, NA, 1, 2, 4, NA),
test2 = c(1, 2, 3, 3, 44, 4, NA),
test3 = c(3, NA, NA, 4, NA, 1, NA),
groupnumber = c(1, 1, 2, 2, 2, 3, 3)
))
df[, `:=`(test1 = ifelse(is.na(test1), mean(test1, na.rm = TRUE), test1),
test2 = ifelse(is.na(test2), mean(test2, na.rm = TRUE), test2),
test3 = ifelse(is.na(test3), mean(test3, na.rm = TRUE), test3)),
by = .(groupnumber)]
df
И результаты:
> df
id test1 test2 test3 groupnumber
1: 1 9.0 1 3 1
2: 2 8.0 2 3 1
3: 3 1.5 3 4 2
4: 4 1.0 3 4 2
5: 5 2.0 44 4 2
6: 6 4.0 4 1 3
7: 7 4.0 4 1 3
Я подозреваю, что есть некоторые другие data.table
приемы, которые делают это немного более динамично, но это работает для данных, которые вы предоставили в вопросе.
Основной синтаксис для data.table
является dt[i, j, by]
и может рассматриваться как синтаксис SQL
, где:
i
является where
j
является select
by
это group by
Подробнее см. ?data.table