Функция R не присваивает значения - PullRequest
0 голосов
/ 05 апреля 2019

Использование данных жилья в Бостоне, train.csv, из Kaggle здесь .Я попытался написать функцию, чтобы изменить значение столбца GarageYrBlt на 0, если строка содержит значение NA или уже равно 0, а в противном случае - 1.

В этом столбце указан год, когда был построен гараж, но он имеетпропущенные значения, а также нули.

Я относительно новичок в R и сопоставил приведенную ниже функцию, чтобы попытаться подставить значения в этом столбце.

library(tidyverse)
housing_prices <- read_csv('../input/train.csv')


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}
}

garage(housing_prices$GarageYrBlt)

Если я помещу печать(x) утверждение перед последней фигурной скобкой функции Я вижу, что логика работает правильно.Однако он не присваивает значения обратно столбцу GarageYrBlt.Я знаю, что упускаю что-то простое здесь.

Кроме того, если кто-то знает о векторизованном способе достижения этой цели или имеет какие-либо другие советы в целом, они всегда очень ценятся.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Функции возвращают последнее значение.Поставьте 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))
0 голосов
/ 05 апреля 2019

Вы должны быть в состоянии использовать dplyr.

library(dplyr)
housing_prices <- housing_prices %>%
    mutate(GarageYrBlt = if_else(is.na(GarageYrBlt),0,GarageYrBlt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...