ifelse()vs attach()创建数据框的新列

时间:2019-01-11 07:09:44

标签: r

我正在尝试在数据框中创建一个新列,该列将用作模型的一部分(使用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函数之前,Carseatstree()列的两个版本似乎没有任何区别。

有人可以帮助我理解为什么我得到两个不同的结果吗?有没有办法使用基数ifelse()(或不使用attach())来使它正常工作?

2 个答案:

答案 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)
  • 如果您只需要从该数据包中获取数据,则无需加载ISLRdata函数可以实现这一目标
  • TRUE / FALSE是优于Yes / No认为可能存在任何未来控制流程的标志。对于布尔变量,您可以执行if (bool_var)而不是if (my_flag == "yes")
    • 然后您可以删除ifelse函数