Как разрешить «нечисловой аргумент в двоичный оператор» в R?

#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 проблемы.

  1. Созданный вектор High не является частью исходного Carseats фрейма данных . Вы должны назначить этот вектор обратно Carseats в качестве нового столбца.
  2. Столбец 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)