将数据框转换为多层嵌套数据框

问题描述 投票:0回答:1

晚上好,

我正在尝试创建一个函数,该函数接受输入数据框架(下面提供的使用最高法院法官的示例数据)并将其重组为多代嵌套数据框架。数据的结构适合在 eCharts4r 树可视化中使用。

tree_data <- data.frame(
      name = c("John Jay", "John Rutledge", "William Cushing", "James Wilson", "John Blair", "James Iredell", "Thomas Johnson", "William Paterson", "Samuel Chase", "Oliver Ellsworth", "Bushrod Washington", "Alfred Moore", "John Marshall", "William Johnson", "John McLean", "Levi Woodbery", "William Strong"),
      big = c(NA, "John Jay", "John Jay", "William Cushing", "William Cushing", "John Rutledge", "John Rutledge", "John Rutledge", "John Jay", "Samuel Chase", "James Iredell", "William Cushing", "John Blair", "Bushrod Washington", "Bushrod Washington", "John McLean", "William Johnson"),
      pledgeClass = c("Founder","A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "E", "E"),
      alumniStatus = c(TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE))

创建的初始数据框架包括有关创始人的信息、他的姓名以及链接到子数据框架的列,该子数据框架包括有关他的所有“小人物”及其所有信息的信息。每个子数据帧都将包含有关这些个人的信息,如果它们有一点,还包含对另一个子数据帧的引用。如果没有,则用“NA”代替。这个过程在整个树中重复,当没有进一步的路径沿着分支时提供“NA”。

这是我迄今为止所能做的最好的事情——在 ChatGPT 的帮助下。该数据基于兄弟会/姐妹会家谱的概念。

create_nested_structure <- function(data) {
  nested_data <- data %>%
    group_by(big) %>%
    summarise(little = list(data.frame(little = unique(name))))

  nested_data$little <- map(nested_data$little, ~ .x)

  return(nested_data)
}

我非常感谢任何帮助,也感谢您花时间阅读这篇文章!

r dataframe data-structures tree
1个回答
0
投票

你可以这样做:

library(tidyverse)

create_nested_structure <- function(data, big_boy) {
  data %>% 
    filter(big %in% big_boy) -> d
  if (nrow(d) == 0) {
    return(NA)
  } else {
    return(mutate(d, children = map(name, ~create_nested_structure(data, .x))))
  }
}
tree <- create_nested_structure(tree_data, NA)

# Output:
# A tibble: 1 × 5
  name     big   pledgeClass alumniStatus children        
  <chr>    <chr> <chr>       <lgl>        <list>          
1 John Jay NA    Founder     TRUE         <tibble [3 × 5]>
© www.soinside.com 2019 - 2024. All rights reserved.