vector - 用多个字符串替换相同的出现
问题描述
假设我有一个包含多个字符串的向量:
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)
解决方案
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"
推荐阅读
- c# - 在断开连接的情况下将同步代码包装到异步等待中
- ms-access - Set multi columns in combobox after choosing a one position from a list
- java - Configure Log4J 2 programatically using a dynamically generated YAML file
- .net - How to validate a copied file on VB.Net
- stackdriver - How to change the logName and configure the stackdriver logging agent in Container-Optimized OS?
- sql - 触发器在列上插入值,如果?
- reactjs - 页面组件在尝试实现响应式布局时重新呈现
- node.js - 如何在 MEAN 堆栈应用程序中创建具有最高访问权限的超级用户?
- swift - 升级到 iOS 12.2 (Xcode 10.2) 后 Swift 4.2 中的奇怪泛型和可选行为
- jquery - 如何在 for 循环中使用延迟