【问题标题】:How to generate all string permutations with given sets of letters at each position in R如何在R中的每个位置生成具有给定字母集的所有字符串排列
【发布时间】:2020-06-18 16:01:18
【问题描述】:

我确信以前有人问过并解决了这个问题,但可能我正在寻找错误的术语。我找不到相关的线程。

R我想生成所有可能的单词/字符串,其中每个位置只能取一组值,比如

  • pos1 可以是 ABC
  • pos2 可以是 ABCD
  • pos3 可以是 ABC
  • pos4 可以是 BCD

等等。 例如:BABC 是一个解决方案,但 DABC 不是。

如果您能指出我的解决方案,我将不胜感激!

感谢您的宝贵时间!

...timb!,timc!,timd! ...

谢谢, 芽

【问题讨论】:

  • 你说 BABA 可以是一个解决方案,但在第 4 位没有可用的 A。这是一个错字还是我误解了你?
  • 哈哈,确实如此,很好发现 :-D 感谢您的解决方案,现在检查一下!

标签: r string permutation


【解决方案1】:

在 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"

【讨论】:

  • 我接受这个,因为这是长字符串最具可扩展性的解决方案! require(stringr); AllPos &lt;- lapply(AllPos, str_split_fixed, pattern = "", n=Inf); AllPos &lt;- lapply(AllPos, as.character) 如果你从单词而不是字母向量开始会更容易
【解决方案2】:

快速而肮脏的基础 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"

reprex package (v0.3.0) 于 2020-06-18 创建

【讨论】:

    【解决方案3】:

    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"
    

    reprex package (v0.3.0) 于 2020 年 6 月 18 日创建

    【讨论】:

    • 这不是和我之前发布的解决方案一样吗?
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 2012-02-29
    • 2018-04-22
    • 2019-12-09
    • 2013-12-23
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多