2016-04-04 2 views
0

После my question Я хотел бы знать, что я должен добавить, чтобы получить значение узла и связать его с его именем. У меня есть решение J48 дерево:Получение значений свойств J48

library(RWeka) 
data(iris) 
res = J48(Species ~., data = iris) 
> res 
J48 pruned tree 
------------------ 

    Petal.Width <= 0.6: setosa (50.0) 
Petal.Width > 0.6 
| Petal.Width <= 1.7 
| | Petal.Length <= 4.9: versicolor (48.0/1.0) 
| | Petal.Length > 4.9 
| | | Petal.Width <= 1.5: virginica (3.0) 
| | | Petal.Width > 1.5: versicolor (3.0/1.0) 
| Petal.Width > 1.7: virginica (46.0/1.0) 

Number of Leaves :  5 

Size of the tree : 9 

и получить в результате следующую строку:

(Petal.Width () Petal.Width (Petal.Length () Petal.Width ())) 

Я хотел бы получить следующее (конкатенацию значений):

(Petal.Width0.6 () Petal.Width1.7 (Petal.Length4.9 () Petal.Width1.5 ())) 

Вот код, который я использую:

library("partykit") 
pres <- as.party(res) 
partykit:::.list.rules.party(pres) 

nam <- names(pres$data) 
tr <- as.list(pres$node) 
str <- "(" 
update_str <- function(x) { 
    if(is.null(x$kids)) { 
    str <<- paste(str, ")") 
    } else { 
    str <<- paste(str, nam[x$split$varid], "(") 
    for(i in x$kids) update_str(tr[[i]]) 
    } 
} 
update_str(tr[[1]]) 
    > str 
[1] "(Petal.Width () Petal.Width (Petal.Length () Petal.Width ()))" 

ответ

0

Просто измените рекурсию:

update_str <- function(x) { 
    if(is.null(x$kids)) { 
    str <<- paste(str, ")") 
    } else { 
    str <<- paste(str, nam[x$split$varid], x$split$breaks, "(") 
    for(i in x$kids) update_str(tr[[i]]) 
    } 
} 

update_str(tr[[1]]) 

> str 
[1] "(Petal.Width 0.6 () Petal.Width 1.7 (Petal.Length 4.9 () Petal.Width 1.5 ()))" 
Смежные вопросы