首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R C5.0使用存储在变量中的公式时选择的未定义列

R C5.0使用存储在变量中的公式时选择的未定义列
EN

Stack Overflow用户
提问于 2018-01-24 22:55:17
回答 1查看 505关注 0票数 1

我正在使用C50 R Package通过决策树进行预测。

我有以下代码:

代码语言:javascript
复制
library("partykit")
library("C50")

//Creates a sample data frame
data <- data.frame(ID = c(1, 2, 3, 4, 5),
               var1 = c('a', 'b', 'c', 'd', 'e'),
               var2 = c(1, 1, 0, 0, 1))

//This is the variable I want to predict
variable <- "ID"

//First I convert the column to factor
data[, variable] <- factor(data[, variable])

//Then I create the formula
formula <- as.formula(paste(variable, " ~ ."))

//And finally I fit the model with the formula
model <- C5.0(formula, data=data, trials=10)

到目前为止,一切都很好,当我尝试绘制树时,问题来了:

代码语言:javascript
复制
png(filename = paste("test.png"), width = 800, height = 60)
plot(model) //This line throws the error: Error in `[.data.frame`(mf, rsp) : undefined columns selected
dev.off()

但如果我改了行:

代码语言:javascript
复制
model <- C5.0(formula, data=data, trials=10)

至:

代码语言:javascript
复制
model <- C5.0(ID ~ ., data=data, trials=10)

一切都很好。

在做了一些调试之后,我得到了这个随机信息:

在C5.0函数中有这样的代码:

代码语言:javascript
复制
call <- match.call()

如果我查看call内部,我会得到以下结果:

代码语言:javascript
复制
C5.0.formula(formula = formula, data = data, trials = 10)

但是如果对C5.0的调用是:

代码语言:javascript
复制
model <- C5.0(ID ~ ., data=data, trials=10)

那么call对象是:

代码语言:javascript
复制
C5.0.formula(formula = ID ~ ., data = data, trials = 10)

这看起来很正常,但是调试plot()函数时,我看到函数as.party(x, trial = trial)会被调用,其中x是C5.0对象。在as.party()函数内部还有另一个调用,即model.frame(obj)调用,其中objC5.0对象,这就是问题所在。在model.frame()函数中,我发现了下面这一行:

代码语言:javascript
复制
rsp <- strsplit(paste(formula$call[2]), " ")[[1]][1]

想起来了吗?该错误引用了该rsp变量。问题是formula$call有两个不同的值。如果我像这样第一次调用call:

代码语言:javascript
复制
model <- C5.0(ID ~ ., data=data, trials=10)

一切正常,因为formula$call包含C5.0.formula(formula = ID ~ ., data = data, trials = 10),而rapID,因此下一次调用:

代码语言:javascript
复制
tmp <- mf[rsp]

执行时没有问题(mf是初始数据帧)。

但是有了电话:

代码语言:javascript
复制
C5.0.formula(formula = formula, data = data, trials = 10)

formula$call对象包含:

代码语言:javascript
复制
C5.0.formula(formula = formula, data = data, trials = 10)

rsp"formula",所以这行代码:

代码语言:javascript
复制
tmp <- mf[rsp]

失败,因为数据框中没有"formula"列。

这是预期的行为吗?如果是这样,我就不能用存储在变量中的公式来调用C5.0了?

我需要以这种方式调用,以便使用许多不同的公式测试算法。

任何帮助都将不胜感激。提前感谢大家。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-24 23:20:30

不幸的是,这是一个bug。请参见github上的issue 8。看起来Max Kuhn (C50的开发者)没有时间去研究它,因为bug报告是在8月份发布的。你可能也想把你的问题附加到那里。这可能会重新引起开发人员的注意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48425423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档