如何匹配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中字符串中的字符?的主要内容,如果未能解决你的问题,请参考以下文章