【发布时间】:2014-04-28 13:37:05
【问题描述】:
我有一个包含一列 (SNP) 的数据框 (trip)。它看起来像这样(但更长,它有 192 个级别):
SNP
C[T->C]T
C[G->C]A
G[A->C]A
C[T->C]C
C[C->A]G
T[G->A]C
...
我想根据以下条件进行模式匹配和替换:
gsub("G->T", "C->A", trip)
gsub("G->C", "C->G", trip)
gsub("G->A", "C->T", trip)
gsub("A->T", "T->A", trip)
gsub("A->G", "T->C", trip)
gsub("A->C", "T->G", trip)
但另外,如果找到上面列出的模式之一,我希望包含它的字符串应用额外的替换。即:
if ((grep(G->T|G->C|G->C|A->T|A->G|A->C), trip$SNP)==TRUE){
substr(trip$SNP, 1,1) <- tr /ATCG/TAGC/; #incompatible perl syntax?
substr(trip$SNP, 8,8) <- tr /ATCG/TAGC/;
}
如中,如果在字符串中找到任何这些模式--G->T、G->C、G->C、A->T、A->G 或 A->C--在trip$SNP中,根据这个正则表达式替换该字符串中的第1个和第8个字符:tr /ATCG/TAGC/;
所需的输出,以粗体显示:
单核苷酸多态性 C[T->C]T C[G->C]A G[A->C]A C[T->C]C C[C->A]G T[G->A]C
到:
单核苷酸多态性 C[T->C]T G[C->G]T C[T->G]T C[T->C]C C[C->A]G A[C->T]G
有没有更优雅的方法来做到这一点?
【问题讨论】:
-
我不完全明白你在做什么(
tr /ATCG/TAGC/你的引号在哪里?)但我有 99.9% 的把握可以将%s粘贴到字符串中您首先执行gsub,然后使用sprintf稍后插入您想要的内容。