如何从嵌套结构不一致的列表创建指定格式的tibble
解决嵌套列表中subject结构不一致导致的tibble列错位问题
针对你遇到的嵌套列表结构不一致(部分作者subject是单条键值对,部分是多子列表嵌套)导致的列错位问题,可通过统一subject结构再整理的方式解决,具体代码如下:
library(tidyverse) # 处理目标列表并生成期望的tibble result <- listexample$books %>% # 将books列表转换为tibble并展开每本书 tibble(books = .) %>% unnest_longer(books) %>% # 提取书籍基础信息并展开作者列表 mutate( title = books$title, authors = books$authors ) %>% select(title, authors) %>% unnest_longer(authors) %>% # 统一subject结构:将单条subject包装为列表,确保所有subject都是子列表的集合 mutate( subject = map(authors$subject, ~ if (!is.null(.x$area)) list(.x) else .x) ) %>% # 提取作者核心信息 select( title, name = authors$name, location = authors$location, subject ) %>% # 展开所有subject条目 unnest_longer(subject) %>% # 移除不需要的abbrev字段 select(-subject$abbrev) %>% # 按书籍和作者分组,给每个学科区域编号 group_by(title, name, location) %>% mutate(subject_col = paste0("subject", row_number(), "area")) %>% # 转换为宽格式,生成指定列 pivot_wider( names_from = subject_col, values_from = subject$area ) %>% ungroup() # 输出结果 print(result)
代码说明
- 统一subject结构:通过
map函数判断,若subject是单条键值对(含area字段),则将其包装为列表;若已是多子列表结构则保持原样,确保后续展开时结构一致。 - 展开与筛选:依次展开书籍、作者、subject条目,移除不需要的
abbrev字段。 - 宽格式转换:按书籍和作者分组,给每个学科区域生成顺序编号的列名,再通过
pivot_wider转换为目标宽格式结构。
运行后将得到你期望的包含title、name、location、subject1area、subject2area、subject3area的tibble。
内容的提问来源于stack exchange,提问作者bill999
相关产品推荐
相关产品推荐

