如何在R中用不同的子字符串替换一个子字符串?

如何在R中用不同的子字符串替换一个子字符串?,r,R,我有一个字符串向量,我想用不同的子字符串替换所有字符串中的一个公共子字符串。我在R中这样做。例如: input=c("I like fruits","I like you","I like dudes") # I need to do something like this newStrings=c("You","We","She") gsub("I",newStrings,input) 因此,输出应该如下所示: "You like fruits" "We like you" "She lik

我有一个字符串向量,我想用不同的子字符串替换所有字符串中的一个公共子字符串。我在R中这样做。例如:

input=c("I like fruits","I like you","I like dudes")
# I need to do something like this
newStrings=c("You","We","She")
gsub("I",newStrings,input)
因此,输出应该如下所示:

"You like fruits"
"We like you"
"She like dudes"
但是,gsub只使用新闻字符串中的第一个字符串。有什么建议吗? 谢谢

mapply()
在这些情况下非常有用:

mapply(sub, "I", newStrings, input, USE.NAMES = FALSE,fixed=T)
# [1] "You like fruits" "We like you"     "She like dudes" 

您可以使用
stringr

stringr::str_replace_all(input, "I" ,newStrings)

[1] "You like fruits" "We like you"    
[3] "She like dudes"
或者按照@David Arenburg的建议:

stringi::stri_replace_all_fixed(input, "I", newStrings)

工作台标记

library(stringi)
library(stringr)
library(microbenchmark)

set.seed(123)
x <- stri_rand_strings(1e3, 10)
y <- stri_rand_strings(1e3, 1)

identical(stringi::stri_replace_all_fixed(x, "I", y), stringr::str_replace_all(x, fixed("I") , y))
# [1] TRUE
identical(stringi::stri_replace_all_fixed(x, "I", y), diag(sapply(y, gsub, pattern = "I", x = x, fixed = TRUE)))
# [1] TRUE
identical(stringi::stri_replace_all_fixed(x, "I", y), mapply(gsub, "I", y, x, USE.NAMES = FALSE, fixed = TRUE))
# [1] TRUE

microbenchmark("stingi: " = stringi::stri_replace_all_fixed(x, "I", y),
               "stringr (optimized): " = stringr::str_replace_all(x, fixed("I") , y),
               "base::mapply (optimized): " = mapply(gsub, "I", y, x, USE.NAMES = FALSE, fixed = TRUE),
               "base::sapply (optimized): " = diag(sapply(y, gsub, pattern = "I", x = x, fixed = TRUE)))

# Unit: microseconds
#                       expr        min          lq        mean      median          uq        max neval cld
#                   stingi:     132.156    137.1165    171.5822    150.3960    194.2345    460.145   100  a 
#      stringr (optimized):     801.894    828.7730    947.1813    912.6095    968.7680   2716.708   100  a 
# base::mapply (optimized):    2827.104   2946.9400   3211.9614   3031.7375   3123.8940   8216.360   100  a 
# base::sapply (optimized):  402349.424 476545.9245 491665.8576 483410.3290 513184.3490 549489.667   100   b
库(stringi)
图书馆(stringr)
图书馆(微基准)
种子集(123)

x您可以使用
sapply
进行此操作

diag(sapply(newStrings,gsub,pattern="I",x=input))

美好的这比我的答案更简洁。@MikeyMike,你的方法更通用。如果你不介意的话,我会很快用一个基准编辑你的文章,这会大大降低内存和性能的效率。哇,一个问题有这么多不同的解决方案,谢谢大家!您只想替换字符串的开头还是字符串中的所有位置?如果<代码> > <代码>在一个字符串中出现数次,会发生什么?@达维达伦堡好点,我想考虑“i”可能出现在任何地方的情况。我猜我的例子有点误导。如果“i”出现在句子的中间,这会导致结果中出现错误的英文。我编辑了你的代码到(1)<代码> MpApple()<代码>,以避免<代码> unListLee()/代码>,(2)<代码> U.Nosis= false < /Cord> >避免<代码>未命名()/代码>,(3)删除了不必要的匿名函数。现在,这一切都集中在一个调用中。也许可以添加
fixed=TRUE
tooSure,也可以将它放在那里!哈哈。我还将更改为
sub()
。我会让他解决剩下的问题;)谢谢你的更新-这是更干净!我编辑了我的帖子,加入了
fixed=T
,但遗漏了
sub()
。我想他可能想替换所有“I”的实例