框架$ yval2 [其中,1L + nclass + 1L:nclass,drop = FALSE]中的调试错误:下标超出范围

时间:2019-09-24 15:51:25

标签: r

我正在使用rpart库来构建回归树,其代码如下:

skillcraft <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/00272/SkillCraft1_Dataset.csv", header = T, sep =",")

skillcraft$LeagueIndex <- factor(skillcraft$LeagueIndex)
skillcraft <- skillcraft[-1]
skillcraft$Age <- as.numeric(levels(skillcraft$Age))[skillcraft$Age]
skillcraft$TotalHours <- as.numeric(
  levels(skillcraft$TotalHours))[skillcraft$TotalHours]
skillcraft$HoursPerWeek <- as.numeric(
  levels(skillcraft$HoursPerWeek))[skillcraft$HoursPerWeek]

skillcraft <- skillcraft[complete.cases(skillcraft),]

library(caret)
set.seed(133)

skillcraft_sampling_vector <- createDataPartition(
  skillcraft$LeagueIndex, p = 0.8, list = F)

skillcraft_train <- skillcraft[skillcraft_sampling_vector,] 
skillcraft_test <- skillcraft[-skillcraft_sampling_vector,]


library(rpart)
regtree <- rpart(LeagueIndex ~., data = skillcraft_train)

regtree_predictions <- predict(regtree, skillcraft_test)

此代码的最后一行抛出错误:

Error in frame$yval2[where, 1L + nclass + 1L:nclass, drop = FALSE] : 
  subscript out of bounds

这似乎还不太清楚,但是我检查了两个数据帧(训练和测试)是否具有相同的结构,现在我很难找到一种调试该代码的方法。

有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我最好的猜测是问题出在LeagueIndex因素上。此变量是作为顺序数据(从Bronze到Professional)提供的,并转换为字符因子"1", "2", "3",依此类推,直到"8"

除了您遇到rpart的错误外,您还根据以下因素对数据进行分区时收到警告:

  

在createDataPartition(skillcraft $ LeagueIndex,p = 0.8,list = F)中:
  有些类没有记录(8),这些记录将被忽略

显然没有LeagueIndex为8的记录。这似乎是在您选择此处的已完成案例之后出现的:

skillcraft <- skillcraft[complete.cases(skillcraft),]

所有LeagueIndex=8案例都将被删除,因为这些案例在AgeHoursPerWeekTotalHours(强制为NA)下将丢失数据通过as.numeric进行了转换。

skillcraft[which(skillcraft$LeagueIndex == 8), c("Age", "HoursPerWeek", "TotalHours")]
     Age HoursPerWeek TotalHours
3341   ?            ?          ?
3342   ?            ?          ?
3343   ?            ?          ?
...

假设您仍然想要一个因数,我相信如果您摆脱了未使用的因数水平,它将起作用,例如:

skillcraft$LeagueIndex <- droplevels(skillcraft$LeagueIndex)

在对数据进行分区之前。 (您可以只在此示例中对训练集进行操作,但您希望测试和训练集中的因子水平相同。)