Прошу прощения за неясный заголовок, но я не совсем уверен, как лучше объяснить проблему словами, и вместо этого попробую использовать пример. Я работаю с набором данных баскетбола, где определенные строки в столбце позиции имеют NA. Я хотел бы обновить столбец позиции с позицией с ближайшей средней высотой в этой позиции за этот год. Вот примерный фрейм данных:
df_player <- data.frame(id = 1:100,
year = floor(runif(100,2000,2006)),
height = runif(100,70,85),
pos = sample(c("G","F","C",NA), size = 100, replace = TRUE))
Я также создал фрейм данных средних высот для каждой позиции и каждого года для простоты объяснения моего идеального решения. Я не собираюсь формировать этот фрейм данных в решении, я просто предоставляю его, чтобы помочь объяснить, что решение должно было бы сделать.
df_avg <- df_player%>%
filter(!is.na(pos))%>%
group_by(year, pos)%>%
summarize(avg_height = mean(height))
Для каждого игрока с отсутствующей позицией в df_player я бы сначала хотел сопоставить год пропавшего игрока с годом в df_avg. Затем сравните рост игрока со средним ростом для каждой позиции в этом году. Используя эти сравнения, я мог бы затем заполнить NA положением, которое соответствует средней позиции, ближайшей к высоте. Я бы предпочел не делать этого с соединениями. Пример на словах:
- Игрок был составлен в 2003 году, но в нем отсутствуют данные о позиции. Рост игрока составляет 73.
-Средние высоты для охранников, нападающих и центров ("G", "F", "C") в 2003 году составляли 70, 72 и 76 соответственно.
- Позиция для игрока в 2003 году будет обновлена до форварда («F»).
Я решил аналогичную проблему с данными цифр c, используя tidyverse group by и mutate. Если высота отсутствовала, решение показано ниже.
df_player%>%
group_by(year)%>%
mutate(height = case_when(is.na(height)~median(height, na.rm = TRUE),TRUE~height))
Я надеюсь найти решение, похожее на это, которое я мог бы использовать внутри трубы, но любая помощь, которую вы можете оказать, очень ценится.