r-如何获取rpart中父节点的名称



嗨,我目前正在尝试提取存储在party对象中的一些父节点信息,如ID。现在我可以使用获取终端节点的ID

fit<-rpart(CommuteDistance ~.,data = Clients)
pr<-as.party(fit)
nodeids(pr,terminal=TRUE)

但是我怎样才能得到父母的身份证呢?如果可能的话,我怎么能得到节点的名称?

由于节点id遵循一个很好的模式,您可以简单地通过parent_id=floor(node_id/2(来确定父id。

这里有一个最小的工作示例,可以得出一个具有节点ID到其父ID映射的表。在它中,我使用tidyverse中的rownames_to_column函数来获取node_ids,而不是使用partykit,但方法类似:

library("rpart")
library("tidyverse")
fit <- rpart(Petal.Length ~ ., data = iris)

get_frame_with_parent <- function(x) {
frame_with_parent <- 
x$frame %>%
tibble::rownames_to_column(var = "node_id") %>%
mutate(node_id = as.numeric(node_id),
parent_id = floor(node_id/2))
frame_with_parent
}
frame_with_parent

可以使用标签(适合(来获取节点名称

对于一个最小的工作示例,将这两件事结合起来,得到一个包含节点ID、节点标签、父ID和父标签的表:

library("rpart")
library("tidyverse")
fit <- rpart(Petal.Length ~ ., data = iris)
get_frame_with_parent <- function(x) {
frame_with_parent <- 
x$frame %>%
mutate(node_label = labels(x)) %>%
tibble::rownames_to_column(var = "node_id") %>%
mutate(node_id = as.numeric(node_id),
parent_id = floor(node_id/2))

frame_with_parent <-
frame_with_parent %>%
left_join(
dplyr::select(frame_with_parent, node_id, node_label),
by = c("parent_id" = "node_id"),
suffix = c("", ".y")
) %>%
dplyr::rename(parent_label = node_label.y)

frame_with_parent
}
get_frame_with_parent(fit)

没有现成的函数可以方便地提取它。但简单地遍历递归partynode结构并获得您感兴趣的自定义量并不困难。首先将递归partynode转换为平面列表也有帮助。

对于一个可复制的示例,请考虑以下rpart树及其party表示:

library("rpart")
fit <- rpart(Petal.Length ~ ., data = iris)
library("partykit")
pr <- as.party(fit)

之后,您可以很容易地转换为as.list(pr$node),它返回递归partynode结构中的所有信息。特别地,它包含每个节点的$id$kidsID(如果有的话(。因此,我们可以使用sapply()和自定义函数轻松提取这些

sapply(as.list(pr$node), function(n) {
if(is.null(n$kids)) c(n$id, NA, NA) else c(n$id, n$kids)
})
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,]    1    2    3    4    5    6    7    8    9
## [2,]    2   NA    4    5   NA   NA    8   NA   NA
## [3,]    3   NA    7    6   NA   NA    9   NA   NA

这在第一列中显示了节点1有两个子节点,即节点2和节点3。节点2是一个终端节点,因为它没有子节点(第二列(,而节点3又有两个子节点,节点4和7等。

最新更新