使用 R 进行序列覆盖

问题描述 投票:0回答:2

我有一个包含 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)

一如既往地欢迎所有答案,但更喜欢整洁的答案。

r dplyr tidyverse sequence
2个回答
1
投票

首先我添加了一个新列并使用滞后函数来获取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

1
投票

即使

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

© www.soinside.com 2019 - 2024. All rights reserved.