如何生成一个包含重复模式和随机字符的序列?

4

我正在尝试生成一系列包含重复图案并穿插随机字母的特定字母序列。

例如:ABXXXXXXXABXXXXXXXABXXXXXXX,其中 X = A、B、C 或 D,随机选择。

我还需要指定序列的总长度、更改重复的字母以及它们重复的频率(例如每 5 个字符重复一次 BC)。

遗憾的是,我只能够生成随机序列,但没有包含重复字母的功能:

set.seed(42)
x <- sample(letters[c(1, 2, 3, 4)], size=200, replace = TRUE)

3
如果你在AB之间随意加入一些字母,使得最终结果像ABxxxxxxABxxxxxxAB这样,那么这些随机的字母也有可能是AB,因此实际上出现的次数不只是3次,而更多。如何处理这种情况?你会区分大小写字母吗?固定的字母用大写表示,样本中的字母用小写表示可以解决这个问题。 - Sotos
@Sotos,AB也可以出现在随机部分中,这不是问题。通过大写字母区分并不是必要的——例如,如果最好的方法是将字符A、B、C、D表示为1、2、3、4,则数字版本序列可以如下:12xxxxxxx12xxxxxxx12,其中x=1、2、3或4。 - baseless
1
我添加了一个答案,请告诉我它是否适用于你。 - Sotos
2个回答

1
这是一个自定义函数,可以在每n个字符处重复一个固定模式。
f1 <- function(x, overall_len, chars_repeat) {
    l1 <- rep(list(x), (overall_len / chars_repeat))
    res <- paste(sapply(l1, function(i)
        paste0(i, paste0(sample(letters[1:4], size = chars_repeat, replace = TRUE), collapse = ''),
        collapse = '')),
        collapse = '')
    return(res)
}

f1('WQ', 32, 8)
#[1] "WQcccdddacWQbacccabcWQccaaaaaaWQabbcddcb"
f1('BC', 20, 4)
#[1] "BCbdbcBCacbdBCdacbBCdbbaBCaccd"
f1('BC', 20, 10)
#[1] "BCdbbabacccaBCbabdbbbaac"
f1('AAA', 40, 5)
#[1] "AAAabcacAAAdbcbcAAAbdbdcAAAadcdcAAAcadbdAAAddaacAAAadcabAAAdbabb"

0

构建一个使用stringi和for循环的函数:

library(stringi)

generateRandomSequence <- function(fixedPart, randomLength, repititions){
  output <- ""

  for(i in 1: repititions){
    newPart <- paste(fixedPart, stri_rand_strings(1, randomLength) ,sep="")
    output <- paste(output,newPart,sep="")
  }

  return(output)
}

我们可以调用这个函数:
generateRandomSequence("AB",5,2)

返回翻译文本:

返回结果:"ABuwHpdABWj8eh"

第一个参数 "AB" 是重复序列。第二个参数是插入在重复序列中的随机字符数。第三部分控制重复次数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接