使用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")