gpt4 book ai didi

替换R中模板字符串中的字母

转载 作者:行者123 更新时间:2023-12-03 07:50:21 27 4
gpt4 key购买 nike

给定英国邮政编码的"template",例如“A9 9AA”,其中“A”是字母占位符,“9”是数字占位符,我想生成随机邮政编码字符串,例如“H8 4GB”。字母可以是任何大写字母,数字可以是 0 到 9 之间的任何数字。

所以如果模板是“AA9A 9AA”那么我想要像“WC1A 9LK”这样的字符串。我现在忽略生成“真实”邮政编码,所以如果“WC1A”是有效的外向代码,我不会感到困扰。

我一直在尝试从 stringi 获取函数。包可以工作,但问题似乎是替换或匹配模板中的“A”只会替换第一个替换,例如:

 stri_replace_all_fixed("A9 9AA",c("A","A","A"), c("X","Y","Z"), vectorize_all=FALSE)
[1] "X9 9XX"

所以它不会用替换向量中的每个元素替换每个“A”(但这是设计使然)。

可能 stringi 里有东西或我错过的基本 R - 我想把它放在那些包中,这样我就不会膨胀我正在做的事情。

蛮力方法是拆分模板,进行替换,将结果粘贴在一起,但我想看看是否有更快、自然的矢量化解决方案。

所以总结一下:
foo("A9 9AA") # return like "B6 5DE"
foo(c("A9 9AA","A9 9AA","A9A 9AA")) # returns c("Y6 5TH","D4 8JH","W0Z 3KQ")

这是一个非向量化版本,它依赖于构造表达式并对其进行评估...
random_pc <- function(fmt){
cc = gsub(" ",'c(" ")',gsub("9","sample(0:9,1)",gsub("A","sample(LETTERS,1)",strsplit(fmt,"")[[1]])))
paste(eval(parse(text=paste0("c(",paste(cc,collapse=","),")"))),collapse="")
}

> random_pc("AA9 9AA")
[1] "KO6 1AY"

最佳答案

据我了解,OP 想要随机创建 UK POST CODE以指定的格式。我认为 sprintf可以提供帮助:

sprintf("%s%s %d%d%s", sample(LETTERS,1),sample(LETTERS,1), sample(0:9,1),
sample(0:9,1), sample(LETTERS,1) )
#1] "BC 59D"

现在,如果目的是使用 9 提供格式和 A然后步骤是首先替换 9%dA%s .

选项#2

另一个选项可以使用 paste0sapply使用自定义函数:
fmt <- "AA 9AA A"
paste0(sapply(strsplit(fmt,""), getCodeText), collapse = "")
#"YF 7OP Z"


#custom function to generate random characters
getCodeText <- function(x){
retVal = x
for(i in seq_along(x)){
if(x[i] == "A"){
retVal[i] = sample(LETTERS,1)
}else if(x[i] == "9"){
retVal[i] = as.character(sample(0:9,1))
}
}
retVal
}

关于替换R中模板字符串中的字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49698090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com