我有一个包含 100 个氨基酸 (AA) 的蛋白质序列,可以作为数据框进行处理。每个 AA 都有一个职位,目前最重要的是职位:
Protein <- data.frame(AA = 1:100)
比我有一个数据框,其中包含来自蛋白质的肽(消化/序列分解后)以及与蛋白质相关的 AA 的初始和最终位置:
df <- data.frame(
Peptides = c("Peptide_A", "Peptide_B", "Peptide_C", "Peptide_D"),
Initial.AA = c(1, 23, 59, 77),
Final.AA = c(18, 58, 70, 100)
)
Output:
Peptides Initial.AA Final.AA
1 Peptide_A 1 18
2 Peptide_B 23 58
3 Peptide_C 59 70
4 Peptide_D 77 100
检查 df 可以清楚地看到一些 AA 未映射(19:22 和 71:76,总共 10 个未映射 AA)。
我希望输出映射AA的总百分比,在本例中为90%(来自所有肽的90个映射AA/100个蛋白质AA)。
一如既往地欢迎所有答案,但更喜欢整洁的答案。
首先我添加了一个新列并使用滞后函数来获取Initial.AA和Final.AA之间的差异。 Lag 将之前的行作为输入。请注意,我们有一个 NA,那是因为第一个行之前没有行。
df<- df%>%mutate(newcol = Initial.AA - lag(Final.AA) -1)
> df
Peptides Initial.AA Final.AA newcol
1 Peptide_A 1 18 NA
2 Peptide_B 23 58 4
3 Peptide_C 59 70 0
4 Peptide_D 77 100 6
然后我计算百分比。在这种情况下我们得到 90%
1- sum(df$newcol, na.rm = TRUE)/NROW(Protein)
[1] 0.9
即使
df$Initial.AA
不从 1: 开始,此解决方案也应该有效
library(dplyr)
library(tidyr)
df <-
rowwise(df) |>
mutate(seq = list(seq(Initial.AA, Final.AA, by = 1))) |>
unnest(seq)
1 - sum(!Protein$AA %in% df$seq)/length(Protein$AA)
#> [1] 0.9
创建于 2024-04-16,使用 reprex v2.1.0