У меня есть фрейм данных, который содержит недостающие данные (NA).Я хочу найти столбцы, которые имеют только одно не пропущенное значение, а затем заполнить эти столбцы этим значением.Например, если мой исходный набор данных выглядит следующим образом:
df = data.frame(A=c(1,2,NA,NA,1), B=c(NA,NA,3,3,3), C=c(2,5,6,3,6), D = c(NA,1, NA,1,1))
A B C D
1 1 NA 2 NA
2 2 NA 5 1
3 NA 3 6 NA
4 NA 3 3 1
5 1 3 6 1
Я хочу достичь:
A B C D
1 1 3 2 1
2 2 3 5 1
3 NA 3 6 1
4 NA 3 3 1
5 1 3 6 1
Сначала я создал эту функцию, чтобы делать то, что я хочу: (пожалуйста, дайте мнезнаю, есть ли у вас лучший вариант для этого)
fill_NAs <- function(x){
x %>% fill(., .direction = "up") %>%
fill(., .direction = "down")
}
А потом я попытался использовать функции mutate_at или mutate_if, но мне не удалось заставить его работать.Вот некоторые из моих попыток:
1)
df= df %>% mutate_if ( ~ length(unique(na.omit(.)))==1, ~ fill_NAs(.))
Я получил эту ошибку:
Ошибка в mutate_impl (.data, dots): оценкаошибка: нет применимого метода для 'fill_', примененного к объекту класса "c ('double', 'numeric')"
.
2)
df_PMM_imp = df_PMM_imp %>% mutate_at(.,names(select_if(.,length(unique(na.omit(.)))==1)), ~ fill_NAs(.))
Я получил эту ошибку:
Ошибка в tbl_if_vars (.tbl, .predicate, caller_env (), .include_group_vars = TRUE): длина (.p) == длина (tibble_vars) равнане ИСТИНА
В общем, я не могу понять логику mutate_if или mutate_at, я всегда сталкиваюсь с такими проблемами.Итак, мои вопросы:
1) Какой правильный синтаксис позволяет достичь того, что я хочу?2) Почему я получаю эти ошибки выше, что я делаю не так?
Заранее большое спасибо.