Как сгенерировать все перестановки строк с заданными наборами букв в каждой позиции в R - PullRequest
0 голосов
/ 18 июня 2020

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

В R, Я хотел бы сгенерировать все возможные слова / строки, где каждая позиция может принимать только набор значений , например

  • pos1 может быть AB C
  • pos2 может быть ABCD
  • pos3 может быть AB C
  • pos4 может быть BCD

et c. Например: BAB C - это решение, а D AB C - нет.

Если вы можете указать мне решение, я был бы очень признателен !

Спасибо за уделенное время!

... тимб !, тим c !, тимд! ...

спасибо, бутон

Ответы [ 3 ]

1 голос
/ 18 июня 2020

В Base R мы можем сделать следующее

pos1 <- c('A','B','C')
pos2 <- c('A','B','C','D')
pos4 <- c('B','C','D')

AllPos <- list(pos1,pos2,pos3,pos4)

result <- AllPos[1]

for(i in AllPos[-1] ){
    result <-  apply(merge(result ,i),1,paste0,collapse="")
}

> result 
  [1] "AAAB" "BAAB" "CAAB" "ABAB" "BBAB" "CBAB" "ACAB" "BCAB" "CCAB" "ADAB"
 [11] "BDAB" "CDAB" "AABB" "BABB" "CABB" "ABBB" "BBBB" "CBBB" "ACBB" "BCBB"
 [21] "CCBB" "ADBB" "BDBB" "CDBB" "AACB" "BACB" "CACB" "ABCB" "BBCB" "CBCB"
 [31] "ACCB" "BCCB" "CCCB" "ADCB" "BDCB" "CDCB" "AAAC" "BAAC" "CAAC" "ABAC"
 [41] "BBAC" "CBAC" "ACAC" "BCAC" "CCAC" "ADAC" "BDAC" "CDAC" "AABC" "BABC"
 [51] "CABC" "ABBC" "BBBC" "CBBC" "ACBC" "BCBC" "CCBC" "ADBC" "BDBC" "CDBC"
 [61] "AACC" "BACC" "CACC" "ABCC" "BBCC" "CBCC" "ACCC" "BCCC" "CCCC" "ADCC"
 [71] "BDCC" "CDCC" "AAAD" "BAAD" "CAAD" "ABAD" "BBAD" "CBAD" "ACAD" "BCAD"
 [81] "CCAD" "ADAD" "BDAD" "CDAD" "AABD" "BABD" "CABD" "ABBD" "BBBD" "CBBD"
 [91] "ACBD" "BCBD" "CCBD" "ADBD" "BDBD" "CDBD" "AACD" "BACD" "CACD" "ABCD"
[101] "BBCD" "CBCD" "ACCD" "BCCD" "CCCD" "ADCD" "BDCD" "CDCD"
1 голос
/ 18 июня 2020

expand.grid - ваш друг.

Простое решение:

apply(expand.grid(list(
    LETTERS[1:3],
    LETTERS[1:4],
    LETTERS[1:3],
    LETTERS[2:4])), 1, paste, collapse = "")
#>   [1] "AAAB" "BAAB" "CAAB" "ABAB" "BBAB" "CBAB" "ACAB" "BCAB" "CCAB" "ADAB"
#>  [11] "BDAB" "CDAB" "AABB" "BABB" "CABB" "ABBB" "BBBB" "CBBB" "ACBB" "BCBB"
#>  [21] "CCBB" "ADBB" "BDBB" "CDBB" "AACB" "BACB" "CACB" "ABCB" "BBCB" "CBCB"
#>  [31] "ACCB" "BCCB" "CCCB" "ADCB" "BDCB" "CDCB" "AAAC" "BAAC" "CAAC" "ABAC"
#>  [41] "BBAC" "CBAC" "ACAC" "BCAC" "CCAC" "ADAC" "BDAC" "CDAC" "AABC" "BABC"
#>  [51] "CABC" "ABBC" "BBBC" "CBBC" "ACBC" "BCBC" "CCBC" "ADBC" "BDBC" "CDBC"
#>  [61] "AACC" "BACC" "CACC" "ABCC" "BBCC" "CBCC" "ACCC" "BCCC" "CCCC" "ADCC"
#>  [71] "BDCC" "CDCC" "AAAD" "BAAD" "CAAD" "ABAD" "BBAD" "CBAD" "ACAD" "BCAD"
#>  [81] "CCAD" "ADAD" "BDAD" "CDAD" "AABD" "BABD" "CABD" "ABBD" "BBBD" "CBBD"
#>  [91] "ACBD" "BCBD" "CCBD" "ADBD" "BDBD" "CDBD" "AACD" "BACD" "CACD" "ABCD"
#> [101] "BBCD" "CBCD" "ACCD" "BCCD" "CCCD" "ADCD" "BDCD" "CDCD"

Создано 18.06.2020 с помощью пакета реплекс (v0.3.0)

1 голос
/ 18 июня 2020

Быстрое и грязное решение на основе R ...

p1 <- "ABC"
p2 <- "ABCD"
p3 <- "ABC"
p4 <- "BCD"

apply(expand.grid(strsplit(p1, "")[[1]], strsplit(p2, "")[[1]],
            strsplit(p3, "")[[1]], strsplit(p4, "")[[1]]), 1, paste0, 
      collapse = "")
#>   [1] "AAAB" "BAAB" "CAAB" "ABAB" "BBAB" "CBAB" "ACAB" "BCAB" "CCAB" "ADAB"
#>  [11] "BDAB" "CDAB" "AABB" "BABB" "CABB" "ABBB" "BBBB" "CBBB" "ACBB" "BCBB"
#>  [21] "CCBB" "ADBB" "BDBB" "CDBB" "AACB" "BACB" "CACB" "ABCB" "BBCB" "CBCB"
#>  [31] "ACCB" "BCCB" "CCCB" "ADCB" "BDCB" "CDCB" "AAAC" "BAAC" "CAAC" "ABAC"
#>  [41] "BBAC" "CBAC" "ACAC" "BCAC" "CCAC" "ADAC" "BDAC" "CDAC" "AABC" "BABC"
#>  [51] "CABC" "ABBC" "BBBC" "CBBC" "ACBC" "BCBC" "CCBC" "ADBC" "BDBC" "CDBC"
#>  [61] "AACC" "BACC" "CACC" "ABCC" "BBCC" "CBCC" "ACCC" "BCCC" "CCCC" "ADCC"
#>  [71] "BDCC" "CDCC" "AAAD" "BAAD" "CAAD" "ABAD" "BBAD" "CBAD" "ACAD" "BCAD"
#>  [81] "CCAD" "ADAD" "BDAD" "CDAD" "AABD" "BABD" "CABD" "ABBD" "BBBD" "CBBD"
#>  [91] "ACBD" "BCBD" "CCBD" "ADBD" "BDBD" "CDBD" "AACD" "BACD" "CACD" "ABCD"
#> [101] "BBCD" "CBCD" "ACCD" "BCCD" "CCCD" "ADCD" "BDCD" "CDCD"

Создано 18.06.2020 с помощью пакета REPEX (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...