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"
当然,这是一个随机的例子。我实际上想要在数百个不同的位置替换基因中的核苷酸。请注意,单个字符(基数)将始终被单个字符替换,而不是我的示例。
或者我可以在一个循环中连续调用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"
答案 0 :(得分:3)
我真的不明白你在寻找什么,因为你甚至说你的例子并不代表你实际在做什么。
可以使用()
也称为捕获组:
gsub("(.*)(this)(.*)", '\\1him\\3', 'get this off my desk')
[1] "get him off my desk"
括号创建组。然后R
可以使用双反斜杠表示法引用捕获的组号:\\1
,\\2
等。这里我有3组
get
this
off my desk
在我的代码中,我将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"