在字符串中的随机位置插入随机字母

时间:2019-04-17 20:40:24

标签: r random text substring

我正在尝试编写一个小脚本,以一个句子为例来演示DNA序列如何进化。我想在R中的字符串中重复替换或插入字母或单词。我希望这种情况反复发生,以便可以观察字符串随时间的变化。最后,我希望字母更改的可能性比单词更改的可能性更大。

到目前为止,我已经定义了一个字符串并创建了字母和单词的列表,并从这两个列表中随机采样。

但是,我不知道如何以设定的概率修改文本。例如,如何使文本中的一个字母有50%的机会被替换为我的字母列表中的一个字母,如果发生这种情况,它应该出现在文本中的随机位置吗?

我也希望此过程发生X次,以便显示随着时间变化的文本。任何帮助或建议,我们将不胜感激。我当前的不完整代码如下

#First I define the string
text <- c("This sentence is changing")


#Then make a vector of words from the string
word_list <- strsplit(text, " ")
word_list <- unlist(word_list)


#Also make a vector of letters from the string
letters_and_gaps <- substring(text, seq(1, nchar(text), 1), seq(1, nchar(text), 1))
letters_and_gaps <- unlist(letters_and_gaps)

#Now for probability 1 in 2 or it occuring, select a random character from letters_and_gaps:
sample(letters_and_gaps, 1)
#Then choose a random character in text and replace it with this randomly sampled character:

#Now with probability 1 in 10 or it occuring, select a random word from word_list
sample(letters_and_gaps, 1)
#Then choose a random word in text and replace it with this randomly sampled word:

#Then print the updated text:
text 

#Iteratively repeat this process X times

我的目标是最终将其放入一个Shiny应用程序中,在其中可以选择发生不同事件(字母或单词替换)的可能性,然后观察它如何影响文本的演变。

1 个答案:

答案 0 :(得分:2)

这是实现的开始。我们只是将您的逻辑包装在一个函数中,并使用for循环一次又一次地应用它。在这里,我将输出放在一个表中,然后仅显示唯一的行(可能不包括它重复变回与上一次迭代相同的字符串的时间,但可能并不重要),因此您可以看到发生了更改。请注意,由于我们是从前一个句子的单词和字符中取样的,并且我们包含空格,因此在插入空格时会形成新单词,并且分布会趋于更均匀(如果一个字符很常见,则趋向于经常替换)

library(tidyverse)

evolve_sentence <- function(sentence, arg2) {
  chars <- str_split(sentence, "") %>% pluck(1)
  if (runif(1) > 0.5) {
    chars[sample(1:length(chars), 1)] <- sample(chars, 1)
  }
  sentence <- str_c(chars, collapse = "")
  words <- str_split(sentence, " ") %>% pluck(1)
  if (runif(1) > 0.9) {
    words[sample(1:length(words), 1)] <- sample(words, 1)
  }
  sentence <- str_c(words, collapse = " ")
  sentence
}

tbl_evolve <- tibble(iteration = 1:500, text = "This sentence is changing")
for (i in 2:500) {
  tbl_evolve$text[i] <- evolve_sentence(tbl_evolve$text[i - 1])
}
tbl_evolve %>%
  distinct(text, .keep_all = TRUE)
#> # A tibble: 204 x 2
#>    iteration text                     
#>        <int> <chr>                    
#>  1         1 This sentence is changing
#>  2         3 hhis sentence is changing
#>  3         4 hhis sentence is chasging
#>  4         6 hhis sestence is chasging
#>  5        10 hhi  sestence is chasging
#>  6        12 hhi  sesnence is chasging
#>  7        14 hhi  sesnesce is chasging
#>  8        15 hhi  se nesce is chasging
#>  9        18 hhi  se nesceiis chasging
#> 10        20 hhi  se nesceiis chasgihg
#> # … with 194 more rows

reprex package(v0.2.1)于2019-04-17创建