Это проблема, которая, как мне кажется, должна быть простой, но поставила меня в тупик. Мне нужно заменить отсутствующие значения, но мне нужно найти заменяемое значение в другом соответствующем заголовке столбца.
Примеры данных:
s <- data.frame(Finch=c(1, 5, NA, 2),
Station_1_Finch=c(NA, NA, NA, NA),
Station_2_Finch=c(NA, NA, 60, NA),
Station_3_Finch=c(NA, NA, NA, NA),
Pigeon=c(NA, 3, 7, NA),
Station_1_Pigeon=c(25, NA, NA, NA),
Station_2_Pigeon=c(NA, NA, 64, NA),
Station_3_Pigeon=c(NA, NA, NA, 50))
birds <- c("Finch", "Pigeon")
Мне нужно найти пропущенные значения для каждой птицы (в моих фактических данных их более 40) и заменить каждое пропущенное значение номером станции для этой птицы из имени столбца, а не соответствующим значением в столбце. К счастью, имена столбцов Station следуют тому же шаблону и их легко анализировать. Это мои желаемые данные:
Finch Station_1_Finch Station_2_Finch Station_3_Finch Pigeon Station_1_Pigeon Station_2_Pigeon Station_3_Pigeon
1 1 NA NA NA 1 25 NA NA
2 5 NA NA NA 3 NA NA NA
3 2 NA 60 NA 7 NA 64 NA
4 2 NA NA NA 3 NA NA 50
Я думал, что mutate_at с пользовательской функцией будет самым простым способом сделать это, но я не могу заставить его работать. (Это было после попытки lapply и простой для l oop.) Вот что у меня есть:
birdcleanup <- function(b) {
rs <- colnames(s)[grepl(pattern = deparse(names(b)[1]), colnames(s)) &
grepl("^Station", colnames(s))]
for(i in seq_along(rs)) {
if(!is.na(s[rs[i]])) {
v <- as.numeric(str_sub(rs[i], start = 9, end = 9))
print(v)
}
}
return(v)
}
surveytrim %>%
mutate_at(birds, ~ if_else(is.na(.), birdcleanup(.), .))
Я подумал, что семейство функций map из purrr может помочь, но после изучения документации, виньетки и подобные вопросы здесь, я все еще в замешательстве. Что я делаю не так?