如何拆分R数据框text列并按PMCID分文件夹导出表格?
解决方案:拆分结构化表格文本并按PMCID导出独立表格
针对你遇到的问题,我整理了一套用tidyverse工具链处理的方案,分为文本拆分和按PMCID导出两个核心步骤:
一、拆分text列(结构化解析)
首先加载所需的R包:
library(tidyverse)
步骤1:拆分文本为独立条目
先把每个text单元格里的分号分隔内容拆分成单独行,并去除多余空格:
tbl_processed <- tbl2 %>% separate_rows(text, sep = "; ") %>% mutate(text = str_trim(text))
步骤2:分类识别条目类型
观察文本结构,我们把条目分为三类:subheading(副标题)、indicator(指标/特征)、group_stat(分组统计值),用正则表达式标记类型:
tbl_processed <- tbl_processed %>% mutate( type = case_when( str_detect(text, "^subheading=") ~ "subheading", str_detect(text, "^.*N =.*=.*$") ~ "group_stat", # 匹配"N = x=y"格式的分组统计 TRUE ~ "indicator" ) )
步骤3:分别解析不同类型的条目
解析副标题(subheading)
tbl_subheading <- tbl_processed %>% filter(type == "subheading") %>% separate(text, into = c("key", "subheading"), sep = "=", extra = "merge") %>% select(PMCID, table, row, subheading)
解析指标/特征(indicator)
tbl_indicator <- tbl_processed %>% filter(type == "indicator") %>% separate(text, into = c("indicator", "indicator_value"), sep = "=", extra = "merge") %>% select(PMCID, table, row, indicator, indicator_value)
解析分组统计值(group_stat)
这里需要处理组名N = 样本量=统计值的格式,提取组名、样本量和统计值:
tbl_group <- tbl_processed %>% filter(type == "group_stat") %>% mutate( # 提取N = 之前的组名并去除空格 group_name = str_extract(text, "^.*(?=N =)") %>% str_trim(), # 提取N = 之后的部分并拆分为样本量和统计值 rest = str_extract(text, "(?<=N =).*$") %>% str_trim() ) %>% separate(rest, into = c("sample_size", "stat_value"), sep = "=", extra = "merge") %>% mutate( sample_size = str_trim(sample_size), stat_value = str_trim(stat_value) ) %>% select(PMCID, table, row, group_name, sample_size, stat_value)
步骤4:整合所有解析结果
将三类条目按PMCID、table、row合并,还原每行的完整信息:
tbl_combined <- tbl_subheading %>% left_join(tbl_indicator, by = c("PMCID", "table", "row")) %>% left_join(tbl_group, by = c("PMCID", "table", "row"))
你可以根据不同表格的需求进一步调整格式,比如转成宽表:
# 示例:整理Table 1为宽格式 table1_wide <- tbl_combined %>% filter(table == "Table 1") %>% pivot_wider( names_from = group_name, values_from = stat_value, names_prefix = "stat_" ) # 示例:整理Table 2为宽格式 table2_wide <- tbl_combined %>% filter(table == "Table 2") %>% pivot_wider( names_from = group_name, values_from = stat_value, names_glue = "{group_name}_stat" )
二、按PMCID创建文件夹并导出表格
接下来自动为每个PMCID创建独立文件夹,并将该PMCID下的所有表格单独导出:
# 获取所有唯一的PMCID unique_pmcids <- unique(tbl2$PMCID) # 循环处理每个PMCID for (pmcid in unique_pmcids) { # 创建文件夹(如果不存在则自动创建) dir.create(pmcid, recursive = TRUE, showWarnings = FALSE) # 获取当前PMCID下的所有表格名称 pmcid_tables <- tbl_combined %>% filter(PMCID == pmcid) %>% distinct(table) %>% pull(table) # 循环导出每个表格 for (tab_name in pmcid_tables) { # 整理当前表格的结构化数据 final_table <- tbl_combined %>% filter(PMCID == pmcid, table == tab_name) %>% pivot_wider( names_from = group_name, values_from = c(sample_size, stat_value), names_glue = "{group_name}_{.value}" ) %>% select(-type, -key) # 移除不需要的辅助列 # 导出到对应文件夹,保存为CSV格式(可替换为write_xlsx导出Excel) write_csv(final_table, file.path(pmcid, paste0(tab_name, ".csv"))) } }
补充说明
- 如果需要导出Excel格式,可替换
write_csv为write_xlsx(需先安装加载writexl包); - 若后续遇到其他格式的文本,可微调正则表达式适配新的结构;
- 针对结构差异较大的表格,可在循环中添加条件判断,单独调整整理逻辑。
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

