【发布时间】:2015-07-14 07:56:24
【问题描述】:
我正在使用基于 x 个变量和数据框的 R rpart 包创建决策树:
fit<-rpart(y~x1+x2+x3+x4,data=(mydataframe),
control=rpart.control(minsplit = 20, minbucket = 0, cp=.01))
但是,我没有使用整个数据框,而是有四五个作为因子的数据子集,假设用 x4 分隔。如何一次对所有这些因素运行决策树,而不必一次又一次地调用数据子集?
基于对 SO 的搜索,看起来 BY 或 ddply 可能是正确的选择。这是我为 ddply 尝试过的:
fit<-ddply(mydataframe, dataframe$x4, function (df)
rpart(y~x1+x2+x3+x4,data=(df),
control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
但我得到的是:
Error in eval(expr, envir, enclos) : object 'x4value' not found
其中 x4value 是我想要拆分的变量值之一。所以我有一列值:
x4
桶名1
桶名2
桶名3
BucketName4
str(mydataframe) 表明 $x4 是一个 : 因子 w/ 8 个级别且没有符号。
此外,我在一开始就运行了 mydataframe = na.omit(dataframe) 以避免空值。
我已经解决的可能问题:
- Variable name
-
Object not found referencing an object that doesn't exist(不是这种情况,因为我的列名存在)
- BucketName1、2、3 和 4 的值不允许以数字开头,我已修复。
当我手动运行时,rpart 位运行良好:
mydataframe<-subset(trainData, x4=="BucketName1")
fit<-rpart(y~x1+x2+x3+x4,data=(mydataframe),
control=rpart.control(minsplit = 20, minbucket = 0, cp=.01))
但是每当我尝试使用 ddply 遍历所有子集时都会出错。
完整的可重现示例代码:
mydataframe<-data.frame ( x1=sample(1:10),
x2=sample(1:10),
x3=sample(1:10),
x4= sample(letters[1:4], 20, replace = TRUE))
str(mydataframe)
fit<-ddply(mydataframe, mydataframe$x4, function (df)
rpart(y~x1+x2+x3+x4,data=(df), control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
输出:
str(mydataframe) 'data.frame': 20 obs. of 4 variables: $ x1: int 1 6 8 4 7 9 3 2 10 5 ... $ x2: int 9 4 5 8 6 3 7 10 2 1 ... $ x3: int 2 6 5 3 1 4 9 7 10 8 ... $ x4: Factor w/ 4 levels "a","b","c","d": 4 4 3 2 3 4 3 3 1 3 ...
> fit<-ddply(mydataframe, mydataframe$x4, function (df) rpart(y~x1+x2+x3+x4,data=(df), control=rpart.control(minsplit = 20, minbucket = 0, cp=.01))) Error in eval(expr, envir, enclos) : object 'd' not found
【问题讨论】:
-
请花时间创建一个最小的reproducible example,并带有示例输入数据。当您共享的代码中的任何地方都没有出现“x4value”时,您会收到关于“x4value”的错误,这似乎很奇怪。好像你漏掉了一些重要的东西。
-
感谢提示,我已经添加了一些示例代码。