Как вменить средства в конкретные наблюдения в столбце?

На данный момент у меня есть задание, включающее таблицу данных, которая включает информацию о наблюдениях за видами животных, измеряемых в разных случаях. В столбце «вес» моих данных есть пропущенные значения, которые я должен заменить средним весом для вида, из которого происходит животное. Поэтому я хотел бы, чтобы средний вес для вида "albigula", равный 148, заменил NA в двух случаях, когда вес животных не регистрировался, чтобы у меня был полный набор данных. Затем мне нужно повторить этот процесс еще для 10 или около того видов.

Я не могу придумать способ сделать это, кроме следующего:

    albigula <- filter(surveys_combined_year, surveys_combined_year$species == "albigula")
    albigula$weight %>% mean(na.rm= TRUE)

Однако это, очевидно, не работает, поскольку я не могу вписать среднее значение в его конкретное место в «surveys_combined_year$weight».

Извините за, вероятно, вопрос супер-новичка, я искал все ресурсы, которые нам дали в классе, и я до сих пор не могу понять, что мне не хватает.

Помоги мне, пожалуйста!


person Jams    schedule 25.04.2019    source источник
comment
вы можете использовать что-то вроде albigula$weight[is.na(albigula$weight)] = mean(albigula$weight,na.rm). Это введет среднее значение во всех местах, где есть NA   -  person boski    schedule 25.04.2019


Ответы (1)


Мы можем сделать group_by replace. Сгруппировано по «видам», replace NA (replace_na) элементов «веса» по mean «веса»

library(dplyr)
library(tidyr)
out <- surveys_combined_year %>%
         group_by(species) %>%
         mutate(weight = replace_na(weight, mean(weight, na.rm = TRUE)))

РЕДАКТИРОВАТЬ - изменено replace на replace_na (комментарии от @BenBolker)

person akrun    schedule 25.04.2019
comment
чтобы быть еще более аккуратным: tidyr::replace_na(weight, mean(weight, na.rm=TRUE)) ? - person Ben Bolker; 25.04.2019
comment
@akrun и BenBolker большое спасибо за совместную помощь! Это было спасением, я не думал, что могу использовать мутацию! Спасибо!! - person Jams; 26.04.2019