Вот вариант с na.aggregate
из zoo
.После группировки по имени измените 0 на NA с помощью na_if
и примените na.aggregate
, чтобы заменить отсутствующие значения на mean
(по умолчанию параметр FUN
равен mean
)
library(dplyr)
library(zoo)
workshops %>%
group_by(name) %>%
mutate(hours = na.aggregate(na_if(hours, 0)))
данные
workshops <- structure(list(student = c("s1", "s1", "s2", "s3", "s3",
"s4"), name = c("ABC", "DEF", "DEF", NA, "ABC", "GHI"),
hours = c(1, NA, 0.5, 2, 2, 0)), .Names = c("student", "name", "hours"),
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))