Ваш вопрос
Относительно вашей функции есть несколько проблем:
age_fill <- function(x){
for (i in length(x$Age)) {
if (!is.na(x$Age[i])) {
return(x$Age[i])
}
# some more code
}
Ваш for
-l oop просто перебирает один элемент: length(x$Age)
возвращает одно значение. Думаю, вы приняли его за 1:length(x$Age)
.
Если ваша функция встречает значение, отличное от NA
, return(x$Age[i])
прерывает / останавливает вашу функцию и возвращает одно значение. Не думаю, что ты этого хочешь. В случае значения, отличного от NA
, вы хотите, чтобы ваша функция ничего не меняла. Поэтому вам следует удалить всю эту часть:
if (!is.na(x$Age[i])) {
return(x$Age[i])
}
else
Ваше состояние
if(is.na(x$Age[i])){
# enter code here
}
достаточно.
Альтернативный подход
Вот решение, использующее dplyr
. Это не прямой ответ на ваш вопрос, но я хочу показать вам другой подход к вашей проблеме. Учитывая набор данных
> df
# A tibble: 6 x 4
Pclass Name Sex Age
<dbl> <chr> <chr> <dbl>
1 2 officer male NA
2 3 mr male 27
3 3 miss female NA
4 3 mr male NA
5 2 mr male NA
6 3 officer male NA
, который я создал с помощью пакета readr
df <- read_table2("Pclass Name Sex Age
2 officer male NA
3 mr male 27
3 miss female NA
3 mr male NA
2 mr male NA
3 officer male NA")
Теперь мы используем mutate
в сочетании с case_when
df %>%
mutate(Age = case_when(!is.na(Age) ~ Age,
Sex == "male" & Pclass == "3" & Name == "officer" ~ 25,
Sex == "male" & Pclass == "2" & Name == "mr" ~ 29,
Sex == "female" & Pclass == "3" & Name == "miss" ~ 18
))
, который дает
# A tibble: 6 x 4
Pclass Name Sex Age
<dbl> <chr> <chr> <dbl>
1 2 officer male NA
2 3 mr male 27
3 3 miss female 18
4 3 mr male NA
5 2 mr male 29
6 3 officer male 25
Используя этот подход, вам не нужна функция или какой-либо l oop, и ваши условия четко упорядочены. Практическое правило: старайтесь избегать петель. Обычно существуют более изощренные способы выполнения задачи без циклов. R использует «скрытые циклы» внутри функций, оптимизированных для производительности. Однако есть задачи, хорошо подходящие для циклов. Так что решение зависит от реальной задачи.