使用rpart构建网球数据决策树时出现矩阵行数匹配错误
R中rpart构建决策树时
cbind行数不匹配错误的解决思路 问题场景
分析网球数据时,运行rpart构建决策树代码抛出错误:
Error in cbind(yval2, yprob, nodeprob) : number of rows of matrices must match (see arg 2)
使用的完整代码如下:
library(rpart) library(rpart.plot) library(ggplot2) library(wesanderson) train=read.csv("/ags_test.csv",header=T, na.strings=c("","NA")) # 注:数据集已用NA填充所有缺失值,共17列、50行 control=rpart.control(cp=0.007) train$res=as.factor(train$res) tree=rpart(res~Tournament+Surface+Round+J1Rank+J2Rank+J1Pts+J2Pts+DRank+DPts,data=train,control=control,parms=list(split="gini"))
可能的解决方向
- 检查因变量
res的类别分布:
该错误常因因变量仅含单一类别触发。运行table(train$res)确认是否所有样本的res取值完全一致——若如此,rpart无法构建决策树(无类别差异可拆分)。 - 排查NA值对建模样本的影响:
rpart默认会删除含NA的行,运行nrow(na.omit(train))查看实际参与建模的行数,再用table(train$res, useNA="always")确认NA是否集中在某类别,导致建模时该类别样本数为0。 - 调整复杂度参数cp:
当前cp=0.007可能过于严格,引发内部计算的行数不匹配。先尝试更大的cp值(如cp=0.01),或直接使用默认rpart.control()参数测试是否能正常运行。 - 检查自变量的取值分布:
确认Tournament、Surface等分类变量是否存在稀疏类别(如某类别仅1个样本),这可能导致拆分时计算异常。用lapply(train[,c("Tournament","Surface","Round")], table)查看分类变量的分布情况。 - 简化模型公式定位问题:
先使用最简公式(如res~J1Rank+J2Rank)运行rpart,若成功则逐步添加其他自变量,定位引发错误的变量。
内容的提问来源于stack exchange,提问作者Foothill_trudger
相关产品推荐
相关产品推荐

