在数据帧的多个子集上运行rpart
我正在使用R rpart包基于x个变量和一个数据帧创建一个决策树:在数据帧的多个子集上运行rpart,r,function,plyr,rpart,R,Function,Plyr,Rpart,我正在使用R rpart包基于x个变量和一个数据帧创建一个决策树: fit<-rpart(y~x1+x2+x3+x4,data=(mydataframe), control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)) 其中,x4value是我要拆分的变量值之一。所以我有一列值: x4 BucketName1 BucketName2 BucketName3 BucketName4 str(mydataframe)显示$x4是
fit<-rpart(y~x1+x2+x3+x4,data=(mydataframe),
control=rpart.control(minsplit = 20, minbucket = 0, cp=.01))
其中,x4value是我要拆分的变量值之一。所以我有一列值:
x4
BucketName1
BucketName2
BucketName3
BucketName4 str(mydataframe)显示$x4是一个:系数,有8个级别,没有符号 此外,我在一开始就运行mydataframe=na.omit(dataframe)以避免空值 我已经排除的可能问题:
- (并非如此,因为存在我的列名)
- BucketName1、2、3和4的值不允许以数字开头,这是我修正的李>
mydataframe<-subset(trainData, x4=="BucketName1")
fit<-rpart(y~x1+x2+x3+x4,data=(mydataframe),
control=rpart.control(minsplit = 20, minbucket = 0, cp=.01))
mydataframe您向dplyr()
.variables=
参数传递的值不正确。您可以传递带引号的变量名、公式或变量名的字符向量。因为您正在传递被强制为一个字符的mydataframe$v4
,并且它正在查找该列中的所有值,就好像它们是变量一样
这是电话的样子
fit<-ddply(mydataframe, ~x4, function (df)
rpart(y~x1+x2+x3+x4,data=(df), control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
fit您想用代码做两件事:
使用dlply
而不是ddply
,因为您需要的是rpart对象的列表,而不是(?)的数据帧<如果您想显示原始数据的预测值,code>ddply
将非常有用,因为它可以格式化为数据帧
在dlply
中使用(x4)
而不是dataframe$x4
。使用后者将产生不可预测的结果
此外,在您的示例中,您应该指定一个y
值,并从x4
之后删除…
。如果您不习惯使用plyr,您也可以使用基本R函数执行此操作
splitData = split(mydataframe, mydataframe$x4)
getModel = function(df) {
fit <- rpart(y~x1+x2+x3+x4+xN....,data=df,
control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
return(fit)
}
models = lapply(splitData, getModel)
请花点时间创建一个包含示例输入数据的最小值。奇怪的是,当“x4value”在您共享的代码中的任何地方都没有出现时,您会得到一个关于“x4value”的错误。似乎您遗漏了一些重要的内容。感谢您的提示,我添加了一些示例代码。谢谢,这非常有效!我本来应该先指定,但我也想用printcp(fit)输出结果,但是printcp(fit)中出现了错误:printcp(fit)
和plotcp(fit)
的“x”必须是“rpart”对象。有没有关于此部件故障排除的提示?您的结果在列表中。如果要获得第一个结果,可以进行打印(拟合[[1]])。您还可以创建一个自动的l_ply()
函数来为您执行此操作,但是您的函数必须保存结果,因为绘图会相互覆盖。您还可以执行类似于par(mfrow=c(2,2))
的操作来获得每个图像的多个绘图。
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
fit<-ddply(mydataframe, ~x4, function (df)
rpart(y~x1+x2+x3+x4,data=(df), control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
fit<-ddply(mydataframe, .(x4), function (df)
rpart(y~x1+x2+x3+x4,data=(df), control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
fit<-ddply(mydataframe, "x4", function (df)
rpart(y~x1+x2+x3+x4,data=(df), control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
splitData = split(mydataframe, mydataframe$x4)
getModel = function(df) {
fit <- rpart(y~x1+x2+x3+x4+xN....,data=df,
control=rpart.control(minsplit = 20, minbucket = 0, cp=.01)))
return(fit)
}
models = lapply(splitData, getModel)
mydataframe %>% group_by(x4) %>%
do(model = getModel(.))