Я хочу вменять пропуски в val
всех ctry
в cat1
с определенными ctry
средствами.
Пример данных
set.seed(654)
df1 <- data.frame(
year=rep(2000:2005, each=5),
ctry=rep(LETTERS[1:5], 6),
val=rnorm(30)
)
df1$cat <- ifelse(df1$ctry %in% c("A", "B"), 1, 0)
df1[sample(nrow(df1), 12), "val"] <- NA
> head(df1)
year ctry val cat
1 2000 A -0.76031762 1
2 2000 B -0.38970450 1
3 2000 C 1.68962523 0
4 2000 D NA 0
5 2000 E 0.09530146 0
6 2001 A NA 1
Сначала я получаю имена ctry
в cat1
и распределяю их средства.
cat1 <- as.character(sort(unique(
df1[!is.na(df1$val) & df1$cat == 1, ]
[, 2])))
cat1 <- sapply(cat1, function(x) mean(df1$val[df1$ctry == x], na.rm=TRUE))
> cat1
A B
0.4372003 0.4792314
Теперь мне удается вручную навязать страну за страной:
df2 <- df1
df2$val[df2$ctry %in% names(cat1)[1] & is.na(df2$val)] <- cat1[1]
> head(df2)
year ctry val cat
1 2000 A -0.76031762 1
2 2000 B -0.38970450 1
3 2000 C 1.68962523 0
4 2000 D NA 0
5 2000 E 0.09530146 0
6 2001 A -0.49758245 1
Но по какой-то причине я не могу заставить sapply()
работать, чтобы выполнить вменение автоматически:
> sapply(seq_along(cat1),
+ function(x) df2$val[df2$ctry %in% names(cat1)[x] & is.na(df2$val)] <- cat1[x])
A B
-0.4975825 -0.6139364
Ожидаемый результат будет представлять собой весь фрейм данных с конкретными вмененными средними значениями стран в категории cat1
.