Функция r для достижения успеха, но не распознается в контейнере

Вот пример сценария R, использующего пару библиотек

library(pmml)
library(pmmlTransformations)
data(iris)
irisBox <- WrapData(iris)
irisBox <- FunctionXform(irisBox,origFieldName="Sepal.Length",
           newFieldName="Sepal.Length.Transformed",
           formulaText="ifelse(Sepal.Length>5,Sepal.Length*1.2, Sepal.Length*.8)")
mod1 <- lm(Sepal.Length.Transformed ~ Petal.Length, irisBox$data)
pmml(mod1, transform = irisBox)

Функция отлично работает и создает хороший вывод pmml. Однако оператор ifelse не является распознаваемой функцией в pmml 4_3. Кто-нибудь может порекомендовать альтернативу приведенному выше сценарию для создания работоспособной команды pmml?

Я признаю, что DiscretizeXform рекомендуется в пакете pmmlTransformations, но он очень громоздкий, поэтому я неохотно его использую, поскольку он должен читать точки останова из внешних файлов.

2 ответа

Решение

pmmlTransformations Пакет не знает, как обрабатывать R-функцию ifelse, и передает ее как есть. Вот почему итоговый документ PMML содержит Apply@function="ifelse" когда он должен содержать Apply@function="if",

Встроенная функция PMML "if" отлично подходит для представления логики ветвления if-else:

Реализует логику IF-THEN-ELSE. ELSE часть не обязательна. Если часть ELSE отсутствует и логическое значение равно false, возвращается отсутствующее значение.

Что касается решения, то, пожалуйста, рассмотрите возможность перехода к r2pmml пакет, который позволяет вам разрабатывать функции внутри формул (в отличие от "бокса") data.frame объекты), включая полную поддержку функции "ifelse":

library("randomForest")
library("r2pmml")

iris.rf = randomForest(Species ~ ifelse(Sepal.Length>5,Sepal.Length*1.2, Sepal.Length*.8) + ., data = iris)

r2pmml(iris.rf, "iris.pmml")

Похоже, простая замена будет работать.

irisBox <- WrapData(iris)
irisBox <- FunctionXform(irisBox,origFieldName="Sepal.Length",
       newFieldName="Sepal.Length.Transformed",
       formulaText="if(Sepal.Length>5) Sepal.Length*1.2 else Sepal.Length*.8")
mod1 <- lm(Sepal.Length.Transformed ~ Petal.Length, irisBox$data)
pmml(mod1, transform = irisBox)
Другие вопросы по тегам