如何匹配R中字符串中的字符?

Posted

技术标签:

【中文标题】如何匹配R中字符串中的字符?【英文标题】:How to match characters from strings in R? 【发布时间】:2022-01-02 08:16:48 【问题描述】:

在发布我的问题之前,我想提一下,我已经查看了 “类似问题” 选项卡,但还没有找到我想要的内容。我发现了一些类似here 的东西,但它是在 python 中的。还有一个好主意 here 作为最后的手段可能会有所帮助。无论如何,如果有更直接的方法,我想先尝试一下。

问题: 假设有 2 个不同的数据帧:(1)Ref_seq; (2)Variants:

>Ref_seq
   Seq_name                                AA_seq
1      Ref1 VSASTQASRQKKMQEISSLVKYFIKCANRRAPRLKCQ
2      Ref2          SNFPHLVLEKILVSLTMKNCKAAMNFFQ
3      Ref3       RRQKRPSSGTIFNDAFWLDLNYLEVAKVAQS
4      Ref4          HCTSVSKEVEGTSYHESLYNALQSLRDR
5      Ref5     DHTGEYGNLVTIQSFKAEFRLAGGVNLPKIIDC
6      Ref6      HKDQMVDIMRASQDNPQDGIMVKLVVNLLQLS
7      Ref7        SNILLKDILSVRKYWCEISQQQWLELFSVY
8      Ref8      LTIFLKTLAVNFRIRVCELGDEILPTLLYIWT
9      Ref9       EDQSSMNLFNDYPDSSVSDANEPGESQSTIG
10    Ref10       SLSEKSKEETGISLQDLLLEIYRSIGEPDSL
>Variants
  peptideID     AA_seq
1      Pep1 QEISALVKYF
2      Pep2 HTGERGNLVT
3      Pep3 NKMTTSVLIK
4      Pep4 SMNLKNDYPD
5      Pep5 NEPGYSQSTI
6      Pep6 NPQDVIMVKL
7      Pep7 MAAKFNKMTL
8      Pep8 RRQKDPSSGT
9      Pep9 QQQWTELFSV

第一个数据框包含来自参考生物的氨基酸 (aa) 序列,而第二个数据框包含来自测试生物的氨基酸 (aa) 序列。已知 来自Variants 对象的序列至少包含 (a) 一个 aa 变化,(b) 与来自Ref_seq 的参考序列匹配的 4 个字符,以及 (c) 匹配可以是正向或向后(例如,Variants 第 3 行的一个序列)。

我正在尝试找到一种方法来查找和检索每个 peptideID 所属的参考序列 (Seq_name)。结果应如下所示:

  peptideID     AA_seq Seq_name
1      Pep1 QEISALVKYF     Ref1
2      Pep2 HTGERGNLVT     Ref5
3      Pep3 NKMTTSVLIK     Ref2
4      Pep4 SMNLKNDYPD     Ref9
5      Pep5 NEPGYSQSTI     Ref9
6      Pep6 NPQDVIMVKL     Ref6
7      Pep7 MAAKFNKMTL     Ref2
8      Pep8 RRQKDPSSGT     Ref3
9      Pep9 QQQWTELFSV     Ref7

我认为可能regex 加上每个 peptideID 的循环,考虑到字符串会根据它而变化。但我无法绕开它。

非常欢迎任何帮助!

示例中的数据:

Ref_seq <- data.frame(Seq_name=paste0("Ref",1:10), AA_seq=c("VSASTQASRQKKMQEISSLVKYFIKCANRRAPRLKCQ", "SNFPHLVLEKILVSLTMKNCKAAMNFFQ", "RRQKRPSSGTIFNDAFWLDLNYLEVAKVAQS", "HCTSVSKEVEGTSYHESLYNALQSLRDR", "DHTGEYGNLVTIQSFKAEFRLAGGVNLPKIIDC", "HKDQMVDIMRASQDNPQDGIMVKLVVNLLQLS", "SNILLKDILSVRKYWCEISQQQWLELFSVY", "LTIFLKTLAVNFRIRVCELGDEILPTLLYIWT", "EDQSSMNLFNDYPDSSVSDANEPGESQSTIG", "SLSEKSKEETGISLQDLLLEIYRSIGEPDSL"))
Variants <- data.frame(peptideID=paste0("Pep",1:9), AA_seq=c("QEISALVKYF", "HTGERGNLVT", "NKMTTSVLIK", "SMNLKNDYPD", "NEPGYSQSTI", "NPQDVIMVKL", "MAAKFNKMTL", "RRQKDPSSGT", "QQQWTELFSV"))

【问题讨论】:

【参考方案1】:

你可以试试这样的。它从 var 中获取 AA,并将它们与 Ref_seq 中的 AA 进行比较,包括反向匹配。它使用agrep 进行模糊匹配。

data.frame( var, Seq_name=unlist( sapply( var$AA_seq, function(x) 
  a <- !anyNA(agrep(x, Ref_seq$AA_seq)[1]); 
  ifelse( a, Ref_seq[ agrep(x, Ref_seq$AA_seq)[1],], 
    Ref_seq[ agrep(paste0(rev(strsplit(x, "")[[1]]), 
    collapse=""),Ref_seq$AA_seq)[1], ] )  ) ) )

  peptideID     AA_seq Seq_name
1      Pep1 QEISALVKYF     Ref1
2      Pep2 HTGERGNLVT     Ref5
3      Pep3 NKMTTSVLIK     Ref2
4      Pep4 SMNLKNDYPD     Ref9
5      Pep5 NEPGYSQSTI     Ref9
6      Pep6 NPQDVIMVKL     Ref6
7      Pep7 MAAKFNKMTL     Ref2
8      Pep8 RRQKDPSSGT     Ref3
9      Pep9 QQQWTELFSV     Ref7

虽然这适用于本示例,但我建议搜索一个可以满足您需求的 Bioconductor 库。这些库已经解决了许多棘手的情况。

数据

Ref_seq <- structure(list(Seq_name = c("Ref1", "Ref2", "Ref3", "Ref4", "Ref5", 
"Ref6", "Ref7", "Ref8", "Ref9", "Ref10"), AA_seq = c("VSASTQASRQKKMQEISSLVKYFIKCANRRAPRLKCQ", 
"SNFPHLVLEKILVSLTMKNCKAAMNFFQ", "RRQKRPSSGTIFNDAFWLDLNYLEVAKVAQS", 
"HCTSVSKEVEGTSYHESLYNALQSLRDR", "DHTGEYGNLVTIQSFKAEFRLAGGVNLPKIIDC", 
"HKDQMVDIMRASQDNPQDGIMVKLVVNLLQLS", "SNILLKDILSVRKYWCEISQQQWLELFSVY", 
"LTIFLKTLAVNFRIRVCELGDEILPTLLYIWT", "EDQSSMNLFNDYPDSSVSDANEPGESQSTIG", 
"SLSEKSKEETGISLQDLLLEIYRSIGEPDSL")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

var <- structure(list(peptideID = c("Pep1", "Pep2", "Pep3", "Pep4", 
"Pep5", "Pep6", "Pep7", "Pep8", "Pep9"), AA_seq = c("QEISALVKYF", 
"HTGERGNLVT", "NKMTTSVLIK", "SMNLKNDYPD", "NEPGYSQSTI", "NPQDVIMVKL", 
"MAAKFNKMTL", "RRQKDPSSGT", "QQQWTELFSV")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))

【讨论】:

以上是关于如何匹配R中字符串中的字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查和删除一列中的字符串是否与R中另一列中的字符串匹配

R中的快速部分字符串匹配

R中的收集函数以匹配字符串中的模式

R中最长的公共子字符串在两个字符串之间找到不连续的匹配

R中的部分动物字符串匹配

R:替换字符串中的外来字符