如何在R语言中重新整理基因优先级字符串数据?
解决基因置信度列拆分问题
方法思路
要把单列的基因-置信度数据拆分为多列,核心是先将数据拆解为**「置信度-单个基因」的长格式**,再转换为以置信度为列的宽格式,具体步骤如下:
- 按
|拆分每行的多置信度组,生成多行数据 - 按
:拆分每个组的置信度与基因列表,分成两列 - 按空格拆分基因列表,得到单个基因的行数据
- 将长格式数据转换为宽格式,每个置信度对应一列,填充对应基因
代码实现(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
相关产品推荐
相关产品推荐

