Функции возвращают последнее значение.Поставьте x
или return(x)
в конце вашей функции, чтобы ваш измененный x
был возвращен из функции.
garage <- function(x) {
for (i in 1:length(x)) {
if (is.na(x[i])) {
x[i] = 0}
else if (x[i] > 0) {
x[i] = 1
}
else x[i] = 0
}
x
}
Затем, если вы хотите, чтобы результат был назначен, вам нужноприсвойте ему =
или <-
housing_prices$GarageYrBlt = garage(housing_prices$GarageYrBlt)
Конечно, мы можем использовать векторизованный ifelse
вместо if
в цикле for:
housing_prices$GarageYrBlt = ifelse(is.na(housing_prices$GarageYrBlt), 0,
ifelse(housing_prices$GarageYrBlt > 0, 1, 0))
Поскольку выпоместите тег tidyverse
, более приятный способ сделать это в dplyr
- использовать case_when
:
housing_prices %>%
mutate(GarageYrBlt = case_when(
is.na(GarageYrBlt) ~ 0,
GarageYrBlt > 0 ~ 1,
TRUE ~ 0
))
С другой стороны, coalesce()
- это хорошая dplyr
утилита для заполнения NA
значений, так что мы могли бы сделать
housing_prices %>%
mutate(GarageYrBlt = ifelse(coalesce(GarageYrBlt, 0) > 0, 1, 0))
Или, что еще интереснее, мы могли бы использовать преобразования по умолчанию TRUE
в 1 и FALSE
в 0:
housing_prices %>%
mutate(GarageYrBlt = as.integer(coalesce(GarageYrBlt, 0) > 0))