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

如何提取列中|+|/-|后的基因名并拆分为多行?

问题需求

现有一份包含邻近基因集的数据,其中nearestTargetGeneAnchorB列包含基因组区域、链信息和基因名的组合(格式类似chrX:start-end|+|GeneName,多个条目用逗号分隔)。需要完成两个操作:

  1. 提取每个条目里|+|或|-|后的基因名,生成新列
  2. 将每个原始记录按基因条目拆分为多行,同时保留原始的所有列值

原始数据如下:

original <- structure(list(id = c(1, 2), distance = c(0, 167155), nearestTargetGeneAnchorB = c("chr1:248838178-248849517|+|ZNF672,chr1:248826377-248826443|+|MIR3124,chr1:248810452-248825955|-|SH3BP5L", "chr1:248323630-248324568|-|OR2M7,chr1:248294616-248295578|-|OR2T12")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -2L))
解决方案

使用tidyverse工具包中的字符串处理和行扩展函数可以高效完成需求:

library(tidyverse)

# 数据处理流程
fixed <- original %>%
  # 将每个单元格的基因条目按逗号拆分为列表
  mutate(gene_entries = str_split(nearestTargetGeneAnchorB, ",")) %>%
  # 展开列表为多行,同步复制其他列的原始值
  unnest_longer(gene_entries) %>%
  # 提取|+|或|-|后的基因名
  mutate(gene_name = str_extract(gene_entries, "\\|[-+]\\|(.*)", group = 1)) %>%
  # 调整列顺序,匹配目标格式的列名
  select(id, distance, nearestTargetGeneAnchorB, gene_name) %>%
  rename(`...4` = gene_name)

# 输出结果
print(fixed)

代码说明

  • str_split(nearestTargetGeneAnchorB, ","):将每个单元格的多个基因条目拆分为字符串列表,每个元素对应一个完整的基因信息条目
  • unnest_longer(gene_entries):将列表列展开为多行,每个基因条目对应一行,同时保留原始的id、distance和nearestTargetGeneAnchorB值
  • str_extract(gene_entries, "\\|[-+]\\|(.*)", group = 1):用正则表达式匹配|+|或|-|,捕获并提取后面的基因名字符串,group = 1指定提取第一个捕获组的内容
  • rename(...4 = gene_name):将新生成的基因名列重命名为目标格式中的...4

注意事项

目标格式中最后一行的基因名为OR2T13,但原始数据中对应的条目是OR2T12,属于输入笔误,上述代码会按原始数据提取为OR2T12。

内容的提问来源于stack exchange,提问作者AKO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:47:32