通过R中data.tree的每条路径计算观察值

通过R中data.tree的每条路径计算观察值,r,tree,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 Passe

使用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
所有内置的计数函数似乎只适用于节点和叶级别,而不适用于观察级别,因此希望我没有遗漏一些内容。从数据帧一次一个节点构建树并计算行数是我遇到的唯一解决方案

我几乎是从更新培训代码开始的,但是它在每个特性上进行拆分和为每个子项递归调用函数之间有所不同。我还尝试过一次将拆分应用于所有功能,结果只是将子级添加到错误的层次结构级别。这是我所能调整的最接近的输出

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")
IsPure
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")