在评估(predvars, data, env)时出现错误: 找不到对象'Rm'。

4
dataset = read.csv('dataset/housing.header.binary.txt')
dataset1 = dataset[6] #higest positive correlation
dataset2 = dataset[13] #lowest negative correlation
dependentVal= dataset[14] #dependent value
new_dataset = cbind(dataset1,dataset2, dependentVal) # new matrix 

#split dataset
#install.packages('caTools')
library(caTools)

set.seed(123) #this is needed to garantee that every run will produce the same output
split = sample.split(new_dataset, SplitRatio = 0.75)
train_set = subset(new_dataset, split == TRUE)
test_set = subset(new_dataset, split == FALSE)


#Fitting Decision Tree to training set
install.packages('rpart')
library(rpart)
classifier = rpart(formula = Medv ~ Rm + Lstat,
                   data = train_set)

#predicting the test set results
y_pred = predict(classifier, newdata = test_set[3], type ='class')

我想要预测test_set的第三列数据,但是一直出现以下错误:

Error in eval(predvars, data, env) : object 'Rm' not found

即使我指定的是test_set[3]而非包含Rmtest_set[1]

列名如下:RmLstatMedv

test_set[3]test_set[2]都会出现相同的错误:

Error in eval(predvars, data, env) : object Rm not found

test_set[1]则会出现:

Error in eval(predvars, data, env) : object 'Lstat' not found

我尝试了以下方法:

  1. names(test_set) <- c('Rm', 'Lstat','Medv'):显式地重命名了变量名。
  2. is.data.frame(test_set):检查了test_set是否为数据框。

我解决了这个问题。 - A-nak Wannapaschaiyong
我遇到了类似的问题,最终解决方法是修复列名。 - Aji
我遇到了同样的问题,但在清除环境(rm(list = ls()))并重新运行代码后问题消失了。 - Tony Peng
3个回答

7
我用以下代码解决了这个问题。
y_pred = predict(classifier, newdata = test_set[-3], type ='class')

https://www.rdocumentation.org/packages/rpart/versions/4.1-13/topics/predict.rpart 这是R文档中的一句话:

"newdata:包含需要预测值的数据框。公式(object)右侧所涉及到的预测变量必须以名称形式出现在newdata中。如果缺失,则返回拟合值。"


注:此处保留了HTML标签。

1
请参考此链接中的教程:在数据、环境中评估predvars时出错

我们需要注意两个要点:

  1. 在新对象中不使用 data.frame

    predict(my_mdl, newdata)
    Error in eval(predvars, data, env) : 
       numeric 'envir' arg not of length one
    
  2. 在新数据框中不使用相同的名称:

    newdf2 <- data.frame(newdata)
    predict(my_mdl, newdf2)
    Error in eval(expr, envir, enclos) : object 'disp' not found
    

0

正如您所提到的,您可以按以下方式删除该列

y_pred = predict(classifier, newdata = test_set[-3], type ='class')

如果它对于另一个列名产生相同的错误,您可以使用

y_pred = predict(classifier, newdata = test_set[, -c(3,5)], type ='class')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接