2017-02-07 87 views
0

我有一个数据框。变量有很多的名字,像这样:R变量名包含分号

/messages/with/:userid/ 
/:id/ 

我读使用数据:

read.csv(file="file-path", header=TRUE, 
      sep=",", check.names = F) 

使原来的名字被保留(通过使用check.names = F)。 我用rpart包训练从数据决策树模型,然后尝试使用该树模型保存到PMML格式:

saveXML(pmml(dt.model, model.name = "DecisionTree_Model", 
     app.name = "model_lr.pmml", 
     description = "Decision Tree Model", 
     unknownValue=0), "dt_model.pmml") 

然而,这会导致以下错误:

Error in field$class[[field$name[i]]] : subscript out of bounds

我认为原因是变量名包含:,所以列索引被搞砸了。

我可以用check.names = T读取数据,从而使变量名看起来像:

X.messages.with..userid. 
X..id." 

然而,因为我需要原始变量名称为PMML文件,我想保持变量名称的原样。有什么办法可以解决这个问题吗?

回答

0

pmml包在内部很不稳定 - 毕竟在R中执行XML操作并不是一个好主意。如果您对将R模型导出为PMML数据格式感兴趣,那么您可以尝试使用r2pmml package。它是用Java编写的(因此不会受到R语言怪癖的影响),而且速度更快,功能更强大。

r2pmml软件包的问题是它不支持rpart::rpart模型类型。因此,您的最佳选项似乎如下:

  1. 重命名data.frame列。将变量名称映射的列表保存到文本文件中。
  2. 使用pmml软件包将rpart模型导出到PMML文件中。
  3. 使用JPMML-Model library打开PMML文件并恢复原始变量名称(基于上述映射文件)。 JPMML-Model为此提供了特殊的API(访问者类别org.jpmml.model.visitors.FieldRenamer)。