ifelse () против attach () для создания нового столбца фрейма данных - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать новый столбец во фрейме данных, который будет использоваться как часть модели (с использованием функции tree()).

При определении нового столбца с использованием ifelse(), R возвращает предупреждение о том, что NA были введены путем принуждения.

library(ISLR)
library(tree)

Carseats$High <- ifelse(Carseats$Sales <= 8, "No", "Yes")

> tree.carseats <- tree(High~.-Sales, data = Carseats)
Warning message:
In tree(High ~ . - Sales, data = Carseats) : NAs introduced by coercion
> summary(tree.carseats)
Error in y - frame$yval[object$where] : 
  non-numeric argument to binary operator

Между тем, следующий код, использующий attach(), похоже, работает правильно. По принуждению не вводятся NA, и tree() работает как задумано.

library(ISLR)
library(tree)

attach(Carseats)
High <- ifelse(Sales <= 8, "No", "Yes")
Carseats <- data.frame(Carseats, High)

> tree.carseats <- tree(High~.-Sales, data = Carseats)
> summary(tree.carseats)

Classification tree:
tree(formula = High ~ . - Sales, data = Carseats)
Variables actually used in tree construction:
[1] "ShelveLoc"   "Price"       "Income"      "CompPrice"   "Population" 
[6] "Advertising" "Age"         "US"         
Number of terminal nodes:  27 
Residual mean deviance:  0.4575 = 170.7 / 373 
Misclassification error rate: 0.09 = 36 / 400

Похоже, что нет никакой разницы в двух версиях столбца High в Carseats до подачи данных в функцию tree().

Может кто-нибудь помочь мне понять, почему я получаю два разных результата? Есть ли способ заставить это работать, используя base ifelse() (или без attach())?

Ответы [ 2 ]

0 голосов
/ 11 января 2019
library(tree)
library(tidyverse)
data(Carseats, package = "ISLR")
Carseats %>%
    mutate(High = as.factor(Sales <= 8)) -> Carseats

tree(High ~ . - Sales, data = Carseats) -> tsmry
summary(tsmry)
  • Нет необходимости загружать ISLR, если вам нужны только данные из этого пакета. data функция обеспечивает, что
  • TRUE / FALSE являются лучшими флагами, чем Yes / No, для любого потенциального будущего потока управления. Для логической переменной вы можете сделать if (bool_var) вместо if (my_flag == "yes")
    • Затем можно сбросить ifelse функцию
0 голосов
/ 11 января 2019

Функция data.frame() имеет опцию stringsAsFactors, по умолчанию stringsAsFactors = default.stringsAsFactors(). Значение по умолчанию default.stringsAsFactors() равно TRUE, поэтому ваш вызов data.frame() создает High как factor, тогда как ifelse() создает character по умолчанию.

Просто используйте

Carseats$High <- factor(ifelse(Carseats$Sales <= 8, "No", "Yes"))

, чтобы заставить его работать без прикрепления данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...