Vector 用多个字符串替换相同的事件

Vector 用多个字符串替换相同的事件,vector,replace,Vector,Replace,假设我有一个包含多个字符串的向量: a<- c('a?cd','ab?cd','abc?') 用G.Grothendieck的答案改进主题 如果同一元素中有两个符号,则应使用不同的模式替换: a <- c('espa?a','per? an?n','peque?os') L <- c('N','U','O','N'); fmt <- gsub("[?]", "%s", a) g <- cumsum(sequence(nc

假设我有一个包含多个字符串的向量:

a<- c('a?cd','ab?cd','abc?')

用G.Grothendieck的答案改进主题

如果同一元素中有两个符号,则应使用不同的模式替换:

a <- c('espa?a','per? an?n','peque?os')
L <- c('N','U','O','N'); 
fmt <- gsub("[?]", "%s", a)
g <- cumsum(sequence(nchar(gsub("[^?]", "", a)))==1)
mapply(function(fmt, x) do.call("sprintf", as.list(c(fmt, x))), fmt, split( L, g), USE.NAMES = FALSE)

a在每个组件上应用
chartr
,如下所示。请注意,
head(…)
c(“b”、“c”、“d”)
。没有使用任何软件包

a<- c('a?cd','ab?cd','abc?') # test input
mapply(chartr, "?", head(letters[-1], length(a)), a, USE.NAMES = FALSE)
## [1] "abcd"  "abccd" "abcd" 
L <- lapply(strsplit(a, ""), setdiff, x = letters[1:4])
L[lengths(L) == 0] <- ""
mapply(`sub`, "[?]", L, a, USE.NAMES = FALSE)
## [1] "abcd" "abcd" "abcd"
stringr::str_replace()
具有矢量化替换,因此您可以执行以下操作:

library(stringr)

str_replace(a, "\\?", letters[seq_along(a) + 1])

[1] "abcd"  "abccd" "abcd" 

您可以从
stringr
软件包中使用
str\u replace

library(stringr)
a<- c('a?cd','ab?cd','abc?') 
str_replace(a,"[?]",letters[2:4])

[1] "abcd"  "abccd" "abcd"

那么,第二个不是
abccd
?这是否为解决方案增加了一些内容,比如“27ñ9”关于如何用不同的字符串替换相同的模式的任何想法:a
绝对有用。谢谢G.格罗森迪克!
library(stringr)
a<- c('a?cd','ab?cd','abc?') 
str_replace(a,"[?]",letters[2:4])

[1] "abcd"  "abccd" "abcd"
str_replace(a, "[?]",  c("b", "c", "d"))

[1] "abcd"  "abccd" "abcd"