运行 对数据框的多个子集进行 rpart
Running rpart over multiple subsets of a data frame
我正在使用基于 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
BucketName3
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
您向 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<-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)))
您想用您的代码做两件事:
使用 dlply
而不是 ddply
,因为您需要一个 rpart 对象列表而不是 (?) 的数据框。如果您想显示原始数据的预测值,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)
您也可以使用 dplyr 而不是 plyr 来执行此操作。
mydataframe %>% group_by(x4) %>%
do(model = getModel(.))
我正在使用基于 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
BucketName3
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
您向 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<-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)))
您想用您的代码做两件事:
使用
dlply
而不是ddply
,因为您需要一个 rpart 对象列表而不是 (?) 的数据框。如果您想显示原始数据的预测值,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)
您也可以使用 dplyr 而不是 plyr 来执行此操作。
mydataframe %>% group_by(x4) %>%
do(model = getModel(.))