2016-04-04 9 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 ()))" 
関連する問題