R语言自动化计算序列修饰占比的脚本开发需求
R语言实现修饰序列占比自动化计算
需求说明
- 基于原始数据框
df1生成目标数据框df2,计算每个样本中各序列对应修饰的占比,公式为:(修饰序列数值 / 同序列同样本所有数值总和) * 100,结果保留两位小数。 - 识别修饰在序列中的位置:例如
ABC[MOD1]对应[3]MOD1,A[MOD1]B[MOD2]C需拆分为[1]MOD1和[2]MOD2分别计算。 - 按
sequence分组处理,覆盖所有样本、序列及修饰。
示例数据
# 初始数据框 df1 df1 <- data.frame(sequence = c(rep("ABC", 3), rep("GHI", 2)), mod = c("ABC[MOD1]", "ABC", "A[MOD1]B[MOD2]C", "G[MOD1]H[MOD1]I", "GHI"), sample_1 = c(1, 0.5, 3, 3, 0.25), sample_2 = c(1.5, 0.75, 2, 1.75, 0.5)) # 目标数据框 df2 df2 <- data.frame(sequence = c(rep("ABC", 3), rep("GHI", 2)), mod = c("[3]MOD1","[1]MOD1","[2]MOD2", "[1]MOD1", "[2]MOD1"), sample_1 = c(0.22,0.67,0.67,0.92,0.92), sample_2 = c(0.35,0.47,0.47,0.78,0.78))
实现脚本
使用tidyverse工具链即可完成全部自动化处理,代码如下:
1. 安装并加载依赖包
# 首次运行需安装 install.packages("tidyverse") library(tidyverse)
2. 核心处理代码
df_result <- df1 %>% # 按sequence分组,计算每个样本的组内总和 group_by(sequence) %>% mutate(across(starts_with("sample_"), ~ sum(.), .names = "total_{.col}")) %>% ungroup() %>% # 拆分mod列的修饰信息,提取位置与修饰类型 mutate(mod_details = map(mod, function(x) { if (!str_detect(x, "\\[")) return(tibble(mod = character(0))) # 匹配修饰字符和修饰标签 mod_matches <- str_match_all(x, "([A-Z])(\\[MOD\\d+\\])")[[1]] # 获取修饰字符在原始序列中的位置 base_seq <- unique(df1$sequence[df1$mod == x]) positions <- str_locate_all(base_seq, mod_matches[,2])[[1]][,1] # 格式化为[位置]MODx的形式 formatted_mod <- str_c("[", positions, "]", str_remove(mod_matches[,3], "\\[|\\]")) tibble(mod = formatted_mod) })) %>% # 展开拆分后的修饰行 unnest(mod_details, keep_empty = FALSE) %>% # 计算占比并保留两位小数 mutate(across(starts_with("sample_"), ~ round((. / get(str_replace(cur_column(), "sample_", "total_sample_")))*100, 2))) %>% # 筛选目标列 select(sequence, mod, starts_with("sample_")) # 输出结果 print(df_result)
运行后得到的df_result与示例中的df2完全一致,可直接替代手动Excel操作。
内容的提问来源于stack exchange,提问作者GentL
相关产品推荐
相关产品推荐

