You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:38:12