我正在尝试在数据框中创建一个新列,该列将用作模型的一部分(使用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()
列的两个版本似乎没有任何区别。
有人可以帮助我理解为什么我得到两个不同的结果吗?有没有办法使用基数ifelse()
(或不使用attach()
)来使它正常工作?
答案 0 :(得分:2)
data.frame()
函数具有选项stringsAsFactors
,该选项默认为stringsAsFactors = default.stringsAsFactors()
。 default.stringsAsFactors()
的默认值为TRUE
,因此您对data.frame()
的调用将High
创建为factor
,而ifelse()
创建了{{1 }}。
只需使用
character
使其无需附加数据即可正常工作。
答案 1 :(得分:2)
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
函数