Вставка случайных букв в случайных местах в строке - PullRequest
2 голосов
/ 17 апреля 2019

Я пытаюсь сделать небольшой сценарий, чтобы продемонстрировать, как последовательности ДНК могут развиваться, используя предложение в качестве примера.Я хотел бы многократно заменять или вставлять буквы или слова в строку в 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 Ответ

2 голосов
/ 18 апреля 2019

Вот начало реализации. Мы просто заключаем вашу логику в функцию и используем цикл 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

Создано в 2019-04-17 пакетом Представить (v0.2.1)

...