首页 > 解决方案 > 用多个字符串替换相同的出现

问题描述

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

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

如何替换第一个“?” 通过 b 第二个“?” 通过 c 和第三个“?” d,为了产生这样的结果:

'abcd','abcd','abcd'

用 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)

标签: vectorreplace

解决方案


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" 

如果您的意思是检查每个组件中是否缺少“a”、“b”、“c”、“d”的任何元素,如果是,则替换?使用该缺少的元素,然后首先创建一个替换列表 L ,然后将其应用于sub每个组件。我们假设每个组件有 0 或 1 个缺失元素和 0 或 1 个 ? 在每个组件中。同样,没有使用任何包。

L <- lapply(strsplit(a, ""), setdiff, x = letters[1:4])
L[lengths(L) == 0] <- ""
mapply(`sub`, "[?]", L, a, USE.NAMES = FALSE)
## [1] "abcd" "abcd" "abcd"

推荐阅读