通过R中data.tree的每个路径计算观察结果

时间:2017-07-28 15:28:44

标签: r tree

使用data.tree构建自定义层次结构,我希望计算每个节点中运行的观察数量。

library(MASS)
library(data.tree)

data(Cars93)

Cars93 <- subset(Cars93, Manufacturer %in% c("Acura","Toyota"))[, c("Manufacturer","DriveTrain","Passengers")]

> Cars93
       Manufacturer DriveTrain Passengers
1         Acura      Front          5
2         Acura      Front          5
84       Toyota      Front          5
85       Toyota      Front          4
86       Toyota      Front          5
87       Toyota        4WD          7

当前输出正在为第一个子节点正确添加子项,但随后跳过“Acura”级别的“DriveTrain”列,并且“Toyota”级别在第一次迭代后停止添加“Passengers”子级。

  levelName       Obs.Ct
1 Cars               6
2  ¦--Acura          2
3  ¦   °--5          2
4  °--Toyota         4
5      ¦--4WD        1
6      ¦   °--7      1
7      °--Front      3

所有内置计数功能似乎只适用于节点和叶子级别,而不是观察级别,所以希望我不会错过那里的东西。一次一个节点从数据框构建树并计算行是我遇到的唯一解决方案。

我已经从https://cran.r-project.org/web/packages/data.tree/vignettes/applications.html#id3-introduction接近更新了训练代码,但是它在分割每个特征和递归调用每个孩子的函数之间中断。我也尝试过将所有功能同时拆分,这只会导致将子级添加到层次结构的错误级别。这是我能够最接近输出的。

IsPure <- function(data) {
    length(unique(data[, ncol(data)])) == 1
}

path_func <- function(node, data) {
    node$Obs.Ct <- nrow(data)

    if (IsPure(data)) {
        child <- node$AddChild(unique(data[, ncol(data)]))
        child$Obs.Ct <- nrow(data)

    } else {
        childObs <- split(data[ , 2:ncol(data), drop = FALSE], data[ , 1], drop = TRUE)

        for(i in 1:length(childObs)) {
            child <- node$AddChild(names(childObs)[i])
            path_func(child, childObs[[i]])
        }
    }
}

tree <- Node$new("Cars")
path_func(tree, Cars93)
print(tree, "Obs.Ct")

0 个答案:

没有答案