R:传递一个字符串向量来替换字符串中的所有实例

时间:2016-05-12 10:04:17

标签: r gsub

如果我有:

mystring<-"I have one cat, two dogs and three rabbits"
numlist<-c("one","two","three")

如何将numlist传递给gsub之类的内容并替换mystring中匹配的所有实例,以便我得到:

"I have ##NUMBER## cat, ##NUMBER## dogs and ##NUMBER## rabbits"

我试过了:

> lapply(mystring,arg1=numlist,function(x,arg1) gsub(arg1,"##NUMBER##",x))
[[1]]
[1] "I have ##NUMBER## cat, two dogs and three rabbits"

Warning message:
In gsub(arg1, "##NUMBER##", x) :
  argument 'pattern' has length > 1 and only the first element will be used

因为gsub没有矢量化。但是我认为lapply可以解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以使用lapply从搜索字符串中构建正则表达式:

gsub(paste(numlist, collapse = '|'), '##NUMBER##', mystring)

这将匹配numlist中的任何字符串。

使用lapply时,您需要反转您的参数,因为您要将功能应用于numlist,而不是mystring;此外,你的函数必须只有一个参数:

lapply(numlist, function (num) gsub(num, '##NUMBER##', mystring))
然而,这会产生不同的结果;也就是说,它将返回三个结果字符串,每个字符串都替换了不同的单词:

[[1]]
[1] "I have ##NUMBER## cat, two dogs and three rabbits"

[[2]]
[1] "I have one cat, ##NUMBER## dogs and three rabbits"

[[3]]
[1] "I have one cat, two dogs and ##NUMBER## rabbits"

答案 1 :(得分:2)

如果我们需要替换数字,我们可以使用gsubfn

 library(gsubfn)
 gsubfn("\\w+", as.list(setNames(1:3, numlist)), mystring)
 #[1] "I have 1 cat, 2 dogs and 3 rabbits"

编辑:我认为我们需要替换与'numlist'中的单词对应的数字。但是,如果我们需要用##NUMBER##标志替换,则一个选项是mgsub

 library(qdap)
 mgsub(numlist, "##NUMBER##", mystring)
 #[1] "I have ##NUMBER## cat, ##NUMBER## dogs and ##NUMBER## rabbits"

答案 2 :(得分:0)

不是一种优雅的方式,但它有效,

x <- "I have ##NUMBER## cat, ##NUMBER## dogs and ##NUMBER## rabbits"
numlist <- c("one","two","three")

for (i in 1:length(numlist)) {
  loc <- regexpr("##NUMBER##", x)
  start_loc <- loc[[1]]
  width <- attr(loc, "match.length")
  x <- paste(substr(x, 1, start_loc - 1), numlist[i], substr(x, start_loc + width, nchar(x)), sep = "")
}

输出:

> x
[1] "I have one cat, two dogs and three rabbits"