Рассмотрим базовые R ave
функцию для запуска метода через уровни факторов. В частности, вы включаете ave()
в ifelse
, чтобы сохранить не пропущенные высоты и заменить пропущенные значения высоты:
df$imp_visit_height <- ifelse(is.na(df$visit_height),
ave(df$visit_height, df$chart_number,
FUN=function(x) mean(x, na.rm=TRUE)),
df$visit_height)
Или менее многословный эквивалент, используя within()
df <- within(df, imp_visit_height <- ifelse(is.na(visit_height),
ave(visit_height, chart_number,
FUN=function(x) mean(x, na.rm=TRUE)),
visit_height))
Для демонстрации со случайными данными, где номер_карты охватывает вычислительные языки / пакеты:
set.seed(43018) # SEEDED FOR REPRODUCIBILITY
grp <- c("julia", "r", "pandas", "sas", "stata", "spss")
df <- data.frame(
chart_number = replicate(100, sample(grp, 1, replace=TRUE)),
time = as.Date(replicate(100, Sys.Date() - sample(1:120, 1, replace=TRUE)),
origin="1970-01-01"),
visit_height = rnorm(100, mean=50, sd=5),
measurement = rnorm(100)*100
)
# RANDOMLY ASSIGN 25 ROWS WITH NA TO visit_height
df[sample(1:100, 25, replace=TRUE), c("visit_height")] <- NA
# CONDITIONALLY IMPUTE MISSING VALUES
df$imp_visit_height <- ifelse(is.na(df$visit_height),
ave(df$visit_height, df$chart_number,
FUN=function(x) mean(x, na.rm=TRUE)),
df$visit_height)
Выходные данные (фильтрация по отсутствующим значениям visit_height)
df[is.na(df$visit_height),]
# chart_number time visit_height measurement imp_visit_height
# 4 sas 2018-02-03 NA -116.072314 49.77708
# 6 spss 2018-04-02 NA 33.049215 52.05987
# 12 julia 2018-01-14 NA 135.954163 52.49936
# 14 pandas 2018-04-09 NA -92.215212 49.23258
# 19 spss 2018-01-21 NA -43.422507 52.05987
# 27 julia 2018-03-18 NA -46.679790 52.49936
# 45 pandas 2018-03-19 NA -181.014747 49.23258
# 48 stata 2018-02-22 NA -89.135797 51.12526
# 51 spss 2018-01-24 NA 9.784664 52.05987
# 53 pandas 2018-04-23 NA 106.461095 49.23258
# 55 pandas 2018-02-17 NA 121.749821 49.23258
# 58 julia 2018-01-19 NA -151.584425 52.49936
# 65 pandas 2018-03-04 NA -148.877957 49.23258
# 70 r 2018-01-05 NA 83.888427 49.29048
# 71 sas 2018-02-21 NA -213.640525 49.77708
# 73 julia 2018-04-18 NA 181.791644 52.49936
# 79 r 2018-03-09 NA -4.446414 49.29048
# 82 pandas 2018-02-20 NA 28.069077 49.23258
# 84 julia 2018-02-27 NA 16.468641 52.49936
# 85 spss 2017-12-31 NA -106.316136 52.05987
# 86 r 2018-02-26 NA 1.450771 49.29048
# 91 spss 2018-04-05 NA -34.662075 52.05987
# 93 r 2018-03-03 NA 36.777125 49.29048
# 95 julia 2018-01-20 NA -36.827340 52.49936
# 98 julia 2017-12-31 NA 125.342483 52.49936