我有一个基于随机森林生成的模型。模型中有一个名为call的属性,它会告诉我实际调用的randomForest函数是什么。
我想获取这个参数,从模型中删除一列,然后再次运行它。
例如:
library(randomForest)data(iris)iris.rf <- randomForest(Species~.-Sepal.Length, data=iris, prox=TRUE)iris.rf$call# 我想同时删除Sepal.Length字段# 调用应该变成# randomForest(Species~.-Sepal.Length-Sepal.Width, data=iris, prox=TRUE)
我尝试将其转换为列表,粘贴新的参数,然后再次添加到iris.rf[[2]]中,但它会粘贴到公式的所有部分。
我无法去除call类别,修改它然后使用eval()再次运行它。
回答:
你可以对paste0
对象使用parse
来获取一个新的表达式。然后你可以将这个新对象作为调用来评估。
可能像这样:
> iris.rf$call[[2]][3] <- parse(text = with(iris.rf, { paste0(call[[2]][3], " - ", rownames(importance)[1]) }))> eval(iris.rf$call)## 调用:# randomForest(formula = Species ~ . - Sepal.Length - Sepal.Width, # data = iris, prox = TRUE) # 随机森林类型: 分类# 树的数量: 500# 在每次分裂时尝试的变量数量: 1## OOB估计的错误率: 3.33%# 混淆矩阵:# setosa versicolor virginica class.error# setosa 50 0 0 0.00# versicolor 0 47 3 0.06# virginica 0 2 48 0.04
请注意,虽然eval(parse(text = ...))
在这个任务中运行得很好,但它并不是推荐的做法。