R语言如何按下划线'_'拆分数据框行名并生成对应独立列
R数据框行名拆分为独立基因列实现方案
你可以直接用以下两种方法实现需求,代码可直接复现运行:
首先构造和示例完全一致的测试数据,方便对照验证:
# 构造示例数据 gene_df <- data.frame( row.names = c("BGN_BGN", "RPS4Y1_BGN", "COMP_BGN", "COL2A1_BGN", "LOC653219_BGN", "XAGE1_BGN"), Sample_01 = c(1.0000000, -0.2367307, 0.2664066, 0.2746505, -0.2651348, -0.2604609) )
方法1:Base R 原生实现(无需安装任何第三方包)
不需要额外装包,打开RStudio就能直接跑,逻辑是把行名按下划线做字符串拆分,再和原数值列拼接成新数据框:
# 按下划线拆分所有行名 split_res <- do.call(rbind, strsplit(rownames(gene_df), split = "_")) # 组装为目标结构的三列数据框 final_df <- data.frame( gen1 = split_res[, 1], gen2 = split_res[, 2], Sample_01 = gene_df$Sample_01 )
运行后输出的final_df完全符合要求的结构:
gen1 gen2 Sample_01 1 BGN BGN 1.0000000 2 RPS4Y1 BGN -0.2367307 3 COMP BGN 0.2664066 4 COL2A1 BGN 0.2746505 5 LOC653219 BGN -0.2651348 6 XAGE1 BGN -0.2604609
方法2:tidyverse 流程实现(适配dplyr数据处理习惯)
如果你平时用tidyverse/dplyr做数据清洗,用这个方法代码更简洁,逻辑更直观:
注意:第一次用需要先运行
install.packages("tidyverse")安装包
library(tidyverse) final_df <- gene_df %>% # 先把行名转为普通列 tibble::rownames_to_column("gene_pair") %>% # 按下划线拆分基因对为两列 tidyr::separate(gene_pair, into = c("gen1", "gen2"), sep = "_") %>% # 调整列顺序为gen1、gen2、Sample_01 select(gen1, gen2, Sample_01)
补充提示:如果后续遇到基因名本身包含下划线的特殊场景,把separate里的sep参数改为sep = "_(?=[^_]+$)",就会固定从最后一个下划线的位置拆分,不会把单个基因名拆错。
内容的提问来源于stack exchange,提问作者Rick...
相关产品推荐
相关产品推荐

