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

如何在R语言中重新整理基因优先级字符串数据?

解决基因置信度列拆分问题

方法思路

要把单列的基因-置信度数据拆分为多列,核心是先将数据拆解为**「置信度-单个基因」的长格式**,再转换为以置信度为列的宽格式,具体步骤如下:

  1. 按|拆分每行的多置信度组,生成多行数据
  2. 按:拆分每个组的置信度与基因列表,分成两列
  3. 按空格拆分基因列表,得到单个基因的行数据
  4. 将长格式数据转换为宽格式,每个置信度对应一列,填充对应基因

代码实现(tidyverse版本)

library(tidyverse)

# 输入数据
df <- structure(list(`Gene Prioritization` = c("Medium High:CCNL2 C1orf170 PLEKHN1 RP11-54O7.17 HES4 | Low:AL645608.7 AL390719.1 WASH7P CPTP", 
"Medium High:CCNL2 ATAD3A C1orf222 CALML6 TMEM52 | Medium Low:GNB1  RER1 NADK | Low:AL109917.1", 
"Medium High:SKI PEX10 C1orf86 AL590822.1 RP11-181G12.4 RP11-181G12.5 | Medium Low:CALML6 TMEM52 CFAP74", 
"Medium High:TNFRSF14 PEX10 | Medium Low:RER1 | Low:AL391244.1", 
"Medium High:PRDM16 | High: ACE")), row.names = c(NA, -5L), class = c("data.table", 
"data.frame"))

# 数据处理流程
result <- df %>%
  # 按|拆分每行的置信度组,生成多行
  separate_rows(`Gene Prioritization`, sep = "\\|") %>%
  # 去除组前后的冗余空格
  mutate(`Gene Prioritization` = str_trim(`Gene Prioritization`)) %>%
  # 拆分置信度与基因列表为两列
  separate(`Gene Prioritization`, into = c("confidence", "genes"), sep = ":") %>%
  # 拆分基因列表为单个基因的行
  separate_rows(genes, sep = "\\s+") %>%
  # 去除基因前后的冗余空格并过滤空值
  mutate(genes = str_trim(genes)) %>%
  filter(genes != "") %>%
  # 按置信度分组,收集所有对应基因(保留重复则去掉unique)
  group_by(confidence) %>%
  summarise(gene_list = list(unique(genes))) %>%
  # 转换为宽格式
  pivot_wider(names_from = confidence, values_from = gene_list) %>%
  # 展开列表为多行,空值填充空字符串
  unnest_wider(everything(), names_sep = "") %>%
  mutate(across(everything(), ~replace_na(.x, "")))

# 查看结果
print(result)

代码说明

  • separate_rows():将多值单元格拆分为多行,分别处理|和空格分隔的内容
  • str_trim():清理字符串前后的冗余空格,避免拆分出错
  • group_by() + summarise(list(genes)):按置信度收集对应基因,若不需要去重则移除unique()
  • pivot_wider():将长格式转换为宽格式,实现置信度到列的映射
  • unnest_wider():将列表列展开为多行,让每个基因在列中依次排列

代码实现(data.table版本,适合大数据场景)

library(data.table)

setDT(df)

# 拆分多置信度组并清理冗余内容
split_groups <- str_split(df$`Gene Prioritization`, "\\|") %>% unlist() %>% str_trim() %>% .[. != ""]

# 拆分置信度与基因,再拆解为单个基因
dt <- data.table(confidence = str_extract(split_groups, "^[^:]+"),
                 genes = str_remove(split_groups, "^[^:]+:")) %>%
  .[, genes := str_split(genes, "\\s+")] %>%
  unnest(genes) %>%
  .[, genes := str_trim(genes)] %>%
  .[genes != ""]

# 收集基因并转换为宽格式
result_dt <- dt[, .(gene_list = list(genes)), by = confidence] %>%
  dcast(. ~ confidence, value.var = "gene_list")

# 统一列长度,空值填充空字符串
max_len <- max(sapply(result_dt, function(x) length(x[[1]])))
result_dt <- lapply(result_dt, function(col) c(col[[1]], rep("", max_len - length(col[[1]])))) %>%
  as.data.table()

# 查看结果
print(result_dt)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:27:13