Мы можем использовать dplyr::mutate_at
для замены NA
s в каждом столбце (кроме Continent
и нечислового c столбца Country
) медианой для Continent
группы
df <- structure(list(Country = structure(1:5, .Label = c("Afghanistan", "Albania", "Algeria", "Andorra", "Angola"), class = "factor"),
CountryID = 1:5, Continent = c(1L, 2L, 3L, 2L, 3L),
Adolescent.fertility.rate.... = c(151L, 27L, 6L, NA, 146L),
Adult.literacy.rate.... = c(28, 98.7, 69.9, NA, 67.4)), class = "data.frame", row.names = c(NA, -5L))
library(dplyr)
df %>%
group_by(Continent) %>%
mutate_at(vars(-group_cols(), -Country), ~ifelse(is.na(.), median(., na.rm = TRUE), .)) %>%
ungroup()
Возвращает:
# A tibble: 5 x 5
Country CountryID Continent Adolescent.fertility.rate.... Adult.literacy.rate....
<fct> <int> <int> <int> <dbl>
1 Afghanistan 1 1 151 28
2 Albania 2 2 27 98.7
3 Algeria 3 3 6 69.9
4 Andorra 4 2 27 98.7
5 Angola 5 3 146 67.4
Объяснение: Сначала мы сгруппируем data.frame df
по Continent
. Затем мы изменяем все столбцы , за исключением столбец группировки (и Country
, который не является цифрой c), следующим образом: если is.na
равен TRUE, мы заменяем его на медиану, и так как мы сгруппированный, это будет медиана для группы Continent
(если это не NA
, мы заменим ее на себя). Наконец, мы призываем ungroup
, чтобы вернуть «нормальный» tibble .