在 R 中替换字符串的单独部分

replace separate parts of a string in R

提问人:jeanlain 提问时间:9/5/2015 最后编辑:jeanlain 更新时间:9/5/2015 访问量:266

问:

substring() <- value或者每个单词只能替换一个字符范围。我想知道如果我想替换字符串中的几个不相交的字符,最好的解决方案是什么。我目前的解决方案如下所示。substr() <- value

string <- "a string"
splitted <- strsplit(string,"",T)[[1]]
splitted[c(1,5,8)] <- c("that", "", "ks")
paste(splitted, collapse="")
[1] "that stinks"

当然,这是一个随机的例子。我实际上想替换基因中数百个不同位置的核苷酸。请注意,单个字符(bases)将始终替换为单个字符,这与我在此处的示例相反。

或者,我可以在循环中连续调用(我认为如果我使用,我无法避免循环,因为我需要多次处理之前的结果),但这可能会更慢。substr() <- valuesubstr()

谢谢你的建议。

编辑:我的例子具有误导性,这是我的测试函数

replaceCharsInString <-function(string, positions, replacement) {
    splitted <- strsplit(string,"",T)[[1]]
    splitted[positions] <- replacement   #'replacement' is a character vector
    paste(splitted,collapse="")
}

> replaceCharsInString("ACCTTTAAGAGATTTAGGGAGA", c(2,5,7), c("G","C","C"))
[1] "AGCTCTCAGAGATTTAGGGAGA"
r 字符串

评论


答:

2赞 Andrew Taylor 9/5/2015 #1

做完这些后,也许我的方式更复杂,但我们开始吧:

f <- function(x, strings, replaces){
  e <- new.env()
  e$x <- x
  if(length(strings)!=length(replaces)) print("Strings should have the same number of elements as replaces") else {

  foo2 <- function(i){
  e$x <- gsub(strings[i], replaces[i], e$x)
}
lapply(1:length(strings), foo2)

}
return(e$x)
}


string <- "a string"
strings <- c("a", "r", "ng")
replaces <- c("that", "", "nks")


f(string, strings, replaces)


[1] "that stinks"

评论

0赞 jeanlain 9/5/2015
我最终希望提供一个字符串、一个指示要替换哪些字符的索引向量,以及作为向量的替换字符。您的示例有效,因为要替换的模式包含唯一元素,但我不确定它能否解决我的问题(我想通过替换通常相同但位于字符串中不同位置的碱基来突变基因)。
3赞 Paul James 9/5/2015 #2

我真的不明白你到底在寻找什么,因为你甚至说你的例子并不代表你实际在做什么。

可以使用也称为捕获组:()

gsub("(.*)(this)(.*)", '\\1him\\3', 'get this off my desk')
[1] "get him off my desk"

括号创建组。 然后,可以使用双反斜杠表示法引用捕获的组号:、 等。在这里,我有 3 组R\\1\\2

  1. get
  2. this
  3. off my desk

在我的代码中,我将(组 2)替换为 .thishim

评论

0赞 jeanlain 9/5/2015
我已经编辑了我的问题,以更好地解释我在寻找什么。
0赞 jeanlain 9/5/2015
这与我在编辑的问题中描述的不符。我需要替换特定位置的字符,而不管字符本身如何。我需要替换位置 x 处的字符,无论它是“A”、“C”还是“G”或其他任何东西。