在数据帧的多个子集上运行rpart

在数据帧的多个子集上运行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是

我正在使用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是一个:系数,有8个级别,没有符号

此外,我在一开始就运行mydataframe=na.omit(dataframe)以避免空值

我已经排除的可能问题:

  • (并非如此,因为存在我的列名)
    • 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))

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(.))