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

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...

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:03:50