R语言:如何将嵌套列表转换为指定格式的Data Frame?
嵌套列表转指定格式数据框的实现方案
原始嵌套列表
nested_list <- list( ID1 = list( FEAT = list( feat1 = list(start = "1", end = "15", label = "CDR1"), feat2 = list(start = "20", end = "25", label = "CDR2") ), SEQ = "ACTGATCGTAGCTAGCTAGATGCTGATGTGTC" ), ID2 = list( SEQ = "ACTGATCGGCGGTGGCTAGCTGTGGGGCGCGCGACCGGGAAAA" ) )
目标数据框格式
id feat feat_label feat_start feat_end full_seq 1 ID1 feat1 CDR1 1 15 ACTGATCGTAGCTAGCTAGATGCTGATGTGTC 2 ID1 feat2 CDR2 20 25 ACTGATCGTAGCTAGCTAGATGCTGATGTGTC 3 ID2 <NA> <NA> NA NA ACTGATCGGCGGTGGCTAGCTGTGGGGCGCGCGACCGGGAAAA
解决方案
直接使用as.data.frame(nested_list)无法处理嵌套结构并生成目标格式,可通过tidyverse工具链完成转换,核心用到unnest系列函数和enframe:
library(tidyverse) result_df <- nested_list %>% # 将命名列表转为id-数据的两列结构 enframe(name = "id", value = "data") %>% # 展开每个ID对应的FEAT和SEQ字段 unnest_wider(data) %>% # 拆分FEAT中的每个feat子项为单独行,保留无FEAT的条目(自动补NA) unnest_longer(FEAT, indices_to = "feat", keep_empty = TRUE) %>% # 展开每个feat的start/end/label为独立列 unnest_wider(FEAT, names_sep = "_") %>% # 重命名SEQ列并调整列顺序 rename(full_seq = SEQ) %>% select(id, feat, feat_label, feat_start, feat_end, full_seq) %>% # 可选:将起始/结束位置转为整数类型 mutate(across(c(feat_start, feat_end), as.integer)) # 输出结果 print(result_df)
关键步骤说明
enframe:把原始命名列表转换为便于处理的tibble结构,明确区分ID和对应的数据内容unnest_wider(data):将每个ID对应的嵌套数据拆分为FEAT和SEQ两个独立列unnest_longer(..., keep_empty = TRUE):把FEAT中的每个子项(如feat1、feat2)拆分为单独行,同时保留没有FEAT的ID2条目,自动填充缺失值为NAunnest_wider(FEAT, names_sep = "_"):把每个feat的嵌套属性(start、end、label)拆分为带前缀的独立列,避免列名冲突
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

