如何在R中用不同的子字符串替换一个子字符串?
我有一个字符串向量,我想用不同的子字符串替换所有字符串中的一个公共子字符串。我在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
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”的实例