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

基于DataFrame中gene列的分号实现行复制与基因拆分

解决方案:拆分基因列至单行单基因

这是生物信息学里很常见的 tidy 数据整理需求,不用手动复制行再拆分,用tidyverse 工具包可以一步到位解决,或者用 Base R 也能实现,两种方案都给你:

方案一:用 tidyverse(推荐,简洁高效)

tidyr 包的 separate_rows() 函数专门用来处理这种「单元格多值拆分到多行」的场景,会自动保留其他列的对应值,完美匹配你的需求:

# 加载工具包
library(tidyverse)

# 你的原始数据
signal1 <- c(rep(1:6))
signal2 <- c(rep(7:12))
signal3 <- c(rep(13:18))
signal4 <- c(rep(19:24))
tag <- c('str1','str2','str3','str4','str5','str6')
gene <- c('ABC','ABC','ABC;DEF','ABC;DEF','DEF','DEF')
df <- data.frame(signal1,signal2,signal3,signal4,tag,gene)

# 核心拆分操作
df_final <- df %>%
  separate_rows(gene, sep = ";")

# 查看结果
print(df_final)

运行后得到的结果就是你期望的格式:

signal1 signal2 signal3 signal4 tag  gene
1       1       7      13      19 str1   ABC
2       2       8      14      20 str2   ABC
3       3       9      15      21 str3   ABC
4       3       9      15      21 str3   DEF
5       4      10      16      22 str4   ABC
6       4      10      16      22 str4   DEF
7       5      11      17      23 str5   DEF
8       6      12      18      24 str6   DEF

方案二:Base R 实现(无需额外包)

如果你不想加载第三方包,用 Base R 的字符串处理和行合并也能完成:

# 原始数据(和上面一致)
signal1 <- c(rep(1:6))
signal2 <- c(rep(7:12))
signal3 <- c(rep(13:18))
signal4 <- c(rep(19:24))
tag <- c('str1','str2','str3','str4','str5','str6')
gene <- c('ABC','ABC','ABC;DEF','ABC;DEF','DEF','DEF')
df <- data.frame(signal1,signal2,signal3,signal4,tag,gene)

# 1. 找出需要拆分的行(gene列含分号)
split_idx <- grepl(";", df$gene)
# 2. 拆分这些行的gene值
split_genes <- strsplit(df$gene[split_idx], ";")
# 3. 生成拆分后的新行
new_rows <- lapply(seq_along(split_genes), function(i) {
  temp_row <- df[split_idx, ][i, ]
  data.frame(temp_row[, -6], gene = split_genes[[i]])
})
# 4. 合并未拆分的行和新行,再按signal1排序
df_final_base <- rbind(df[!split_idx, ], do.call(rbind, new_rows))
df_final_base <- df_final_base[order(df_final_base$signal1), ]

# 查看结果
print(df_final_base)

这个方案也能得到和方案一完全一致的结果,只是代码稍长一些。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:55:08