2017-02-07 81 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)。