【问题标题】:In R, how do I apply regexes to specific parts of a string that contains a pattern?在 R 中,如何将正则表达式应用于包含模式的字符串的特定部分?
【发布时间】: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 稍后插入您想要的内容。

标签: regex r substring


【解决方案1】:

可能有一些附加软件包可以更好更快地做到这一点,但这会起作用(我认为我没有你想要的东西,但它足够接近你可以适应你所追求的东西)。请注意,前 14 行只是修改您的数据,解决方案只有几行。

dat <- read.table(text="trip
C[T->C]T
C[G->C]A
G[A->C]A
C[T->C]C
C[C->A]G
T[G->A]C", header=TRUE, stringsAsFactors = FALSE)

replace <- matrix(c("G->T", "%s[C->A]%s",
"G->C", "%s[C->G]%s",
"G->A", "%s[C->T]%s",
"A->T", "%s[T->A]%s",
"A->G", "%s[T->C]%s",
"A->C", "%s[T->G]%s"), ncol=2, byrow=TRUE)


for(i in 1:nrow(replace)) {
    dat$trip[grepl(replace[i, 1], dat$trip)] <- replace[i, 2]
}

sprintf(dat$trip, "/ATCG/TAGC/", "/ATCG/TAGC/")

## [1] "C[T->C]T"                     "/ATCG/TAGC/[C->G]/ATCG/TAGC/"
## [3] "/ATCG/TAGC/[T->G]/ATCG/TAGC/" "C[T->C]C"                    
## [5] "C[C->A]G"                     "/ATCG/TAGC/[C->T]/ATCG/TAGC/"

【讨论】:

  • 这成功替换了 [] 之间的字符串,但我的输出在替换的行中包含 %s。头部(测试$SNP)[1]“C[T->C]T”“%s[C->G]%s”“%s[T->G]%s”“C[T->C ]C" "C[C->A]G" "%s[C->T]%s"
  • 那么您没有使用sprintf 完成最后一步,无论如何您是在花时间提问,而不是花时间让原始问题更清晰。我不知道你想要什么。您最好的选择是从上方显示所需的输出。并确保您发布的数据与您正在使用的数据相似。
  • 我确实使用了 sprintf,但无济于事。我已经用所需的输出更新了帖子。 "tr /ATCG/TAGC/" 是一个 perl 正则表达式,它用 T 替换 A,用 A 替换 T,等等。我只需要在 R 中实现它。
【解决方案2】:
SNP <- as.character(trip$SNP)
SNP
[1] "C[T->C]T" "C[G->C]A" "G[A->C]A" "C[T->C]C" "C[C->A]G" "T[G->A]C"
i <- grep("(A|G)->", SNP)
SNP[i] <- chartr("ACGT", "TGCA", SNP[i])
SNP
[1] "C[T->C]T" "G[C->G]T" "C[T->G]T" "C[T->C]C" "C[C->A]G" "A[C->T]G"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多