Случайно перетасовывать буквы в словах в предложениях

Я хочу случайным образом нарушить порядок букв, из которых состоят слова в предложениях. Я могу перетасовать отдельные слова, например:

a <- "bach"
sample(unlist(str_split(a, "")), nchar(a))
[1] "h" "a" "b" "c"

но я не могу сделать это для предложений, например:

b <- "bach composed fugues and cantatas"

Что я уже пробовал:

разделить на слова:

b1 <- str_split(b, " ")
[[1]]
[1] "bach"     "composed" "fugues"   "and"      "cantatas"

вычислить количество символов в слове:

n <- lapply(b1, function(x) nchar(x))
n
[[1]]
[1] 4 8 6 3 8

разделить слова в b1 на отдельные буквы:

b2 <- str_split(unlist(str_split(b, " ")), "")
b2
[[1]]
[1] "b" "a" "c" "h"    
[[2]]
[1] "c" "o" "m" "p" "o" "s" "e" "d"    
[[3]]
[1] "f" "u" "g" "u" "e" "s"    
[[4]]
[1] "a" "n" "d"    
[[5]]
[1] "c" "a" "n" "t" "a" "t" "a" "s"

Перепутайте буквы в каждом слове на основе вышеизложенного:

lapply(b2, function(x) sample(unlist(x), unlist(n), replace = T))
[[1]]
[1] "h" "a" "c" "b"   
[[2]]
[1] "o" "p" "o" "s"   
[[3]]
[1] "g" "s" "s" "u"    
[[4]]
[1] "d" "d" "a" "d"   
[[5]]
[1] "c" "n" "s" "a"

Это явно не тот результат. Как я могу случайным образом перепутать последовательность букв в каждом слове в предложении?


person Chris Ruehlemann    schedule 02.06.2020    source источник
comment
Dupe-oid: лучший способ перетасовать элементы строки в R. Таким образом, например. stri_rand_shuffle(stri_split_fixed(b, " ")[[1]])   -  person Henrik    schedule 02.06.2020
comment
Это супер крутое решение, и вы обязательно должны опубликовать его.   -  person Chris Ruehlemann    schedule 02.06.2020


Ответы (1)


После b2 вы можете случайным образом перетасовать символы с помощью sample и вставить слова обратно.

paste0(sapply(b2, function(x) paste0(sample(x), collapse = "")), collapse = " ")
#[1] "bhac moodscpe uefusg and tsatnaac"

Обратите внимание, что вам не нужно упоминать size в sample, если вы хотите, чтобы выходные данные имели ту же длину, что и ввод с replace = FALSE.

person Ronak Shah    schedule 02.06.2020