#r
#r
Вопрос:
Это мой полный код:
library(tree)
library(ISLR)
attach(Carseats)
High = ifelse(Sales <= 8, "No", "Yes")
Carseats = data.frame(Carseats, High)
Carseats$var15 <- NULL
Carseats$var16 <- NULL
tree.carseats = tree(High~.-Sales, Carseats)
summary(tree.carseats)
Из фрейма данных Carseats я только что удалил два случайно созданных столбца (var15 и var16, все из которых содержали NA для всех своих строк. Чтобы воспроизвести это, вы должны создать два столбца var15 и var16, с NA в качестве входных данных в строках, с последними индексами.
Carseats$var15 <- NULL
Carseats$var16 <- NULL
После чего мой код для summary(tree.carseats) выводит следующее сообщение об ошибке:
Error in y - frame$yval[object$where] : non-numeric argument to binary operator
Предполагается, что я получаю следующий результат, когда запускаю сводку (tree.carseats).:
Classification tree: tree(formula = High ∼ . - Sales , data = Carseats )
Variables actually used in tree construction:
[1] "ShelveLoc " "Price" "Income" "CompPrice "
Test Classification Error
0.05 0.10 0.15 0.20 0.25
[5] "Population " "Advertising " "Age" "US" Number of terminal nodes: 27
Residual mean deviance: 0.4575 = 170.7 / 373 Misclassification error rate: 0.09 = 36 / 400
Также обратите внимание, что я получаю предупреждающее сообщение при запуске tree (High ~ . — Продажи, автомобильные сиденья)
1: In tree(High ~ . - Sales, Carseats) : NAs introduced by coercion
2: In tree(High ~ . - Sales, Carseats) : NAs introduced by coercion
Чтобы воспроизвести это, вы должны создать 2 дополнительных столбца из данных Carseats. Я понятия не имею, как я случайно создал 2 ненужных столбца, но я считаю, что причиной сообщения об ошибке является то, как я удалил их с помощью приведенного выше кода. Пожалуйста, помогите, спасибо.
Ответ №1:
Проблема не имеет ничего общего с удалением столбцов.
Вместо этого у вас есть 2 проблемы.
- Созданный вектор
High
не является частью исходногоCarseats
фрейма данных . Вы должны назначить этот вектор обратноCarseats
в качестве нового столбца. - Столбец
Carseats$High
должен быть фактором, а не символьным вектором.
library(tree)
library(ISLR)
data(Carseats)
Carseats$High = ifelse(Sales <= 8, "No", "Yes")
Carseats$High = as.factor(Carseats$High)
tree.carseats = tree(High~.-Sales, Carseats)
summary(tree.carseats)
#Regression tree:
#tree(formula = High ~ . - Sales, data = Carseats)
#Variables actually used in tree construction:
#[1] "ShelveLoc" "Price" "Income" "Advertising" "CompPrice" "Age"
#Number of terminal nodes: 19
#Residual mean deviance: 0.08725 = 33.24 / 381
#Distribution of residuals:
# Min. 1st Qu. Median Mean 3rd Qu. Max.
#-0.93750 -0.06250 -0.02000 0.00000 0.06667 0.98000
Альтернативным подходом к преобразованию в фактор в отдельной строке было бы выполнение операции в ifelse
вызове:
Carseats$High = ifelse(Sales <= 8, as.factor(c("No","Yes"))[1],
as.factor(c("No","Yes"))[2])
Комментарии:
1. Спасибо! Каков был бы наилучший способ разрешить эту проблему или преобразовать ее в символ?
2. Спасибо! Это сработало. Однако мне интересно, почему High = as.factor(ifelse(Продажи <= 8, «Нет», «Да»)) не работает. Когда я перезаписал существующую переменную High приведенным выше кодом, она успешно преобразовала свой тип данных, но сообщения об ошибках все еще появляются.
Ответ №2:
следующий код работает для меня:
library(tree)
library(ISLR)
attach(Carseats)
High=ifelse(Sales<=8,"No", "Yes")
High=as.factor(High)
Carseats=data.frame(Carseats,High)
tree.carseats=tree(High~.-Sales,Carseats)
summary(tree.carseats)