如何提取列中|+|/-|后的基因名并拆分为多行?
问题需求
现有一份包含邻近基因集的数据,其中nearestTargetGeneAnchorB列包含基因组区域、链信息和基因名的组合(格式类似chrX:start-end|+|GeneName,多个条目用逗号分隔)。需要完成两个操作:
- 提取每个条目里
|+|或|-|后的基因名,生成新列 - 将每个原始记录按基因条目拆分为多行,同时保留原始的所有列值
原始数据如下:
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
相关产品推荐
相关产品推荐

