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

时间:2015-09-04 18:43:40

标签: r string

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

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

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

或者我可以在一个循环中连续调用substr() <- value(如果我使用substr(),我认为我可以避免循环,因为我需要多次处理前一个结果),但那可能会慢一点。

感谢您的建议。

编辑:我的例子有误导性,这是我的测试功能

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"

2 个答案:

答案 0 :(得分:3)

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

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

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

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

  1. get
  2. this
  3. off my desk
  4. 在我的代码中,我将this(第2组)替换为him

答案 1 :(得分:2)

完成此操作后,也许我的方式更复杂,但我们走了:

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"