【问题标题】:How to get all combinations of words from several buckets?如何从几个桶中获取所有单词组合?
【发布时间】:2020-11-03 11:18:13
【问题描述】:

我有几组单词,我想从一组单词中获得所有可能的组合。例如:

a <- c("chicken","turkey")
b <- c("legs","wings")

我想得到这样的东西:

"chicken.*legs|legs.*chicken|chicken.*wings|wings.*chicken|turkey.*legs|legs.*turkey|turkey.*wings|wings.*turkey"

不一定只有两组单词,我想获得一种适用于一组列表的稳健方法。

【问题讨论】:

  • 你有多少套?
  • @ekoam 我想得到一个健壮的方法,该方法适用于无限数量的集合。谢谢你的问题,我没有在帖子中提到它。
  • 所以我们假设有 3 个集合 abc。您想要最终输出是 3 个集合的组合(如 a.*b.*c|a.*c.*b)还是任意 2 个集合(如 a.*b|a.*c)?
  • @ekoam 三者组合

标签: r combinations


【解决方案1】:

这行得通吗:

library(dplyr)
rbind(expand.grid(a, b), expand.grid(b, a)) %>% mutate(x = paste0(Var1,'.','*',Var2, collapse = '|')) %>% distinct(x) %>% pull(x)
[1] "chicken.*legs|turkey.*legs|chicken.*wings|turkey.*wings|legs.*chicken|wings.*chicken|legs.*turkey|wings.*turkey"

【讨论】:

    【解决方案2】:

    您可以使用outer

    a <- c("chicken","turkey")
    b <- c("legs","wings")
    
    paste0(c(outer(a, b, paste, sep = '.*'),
             outer(b, a, paste, sep = '.*')), collapse = '|')
    
    #[1] "chicken.*legs|turkey.*legs|chicken.*wings|turkey.*wings|legs.*chicken|wings.*chicken|legs.*turkey|wings.*turkey"
    

    【讨论】:

      【解决方案3】:

      我认为这个功能可以解决你的问题

      library(combinat)
      library(purrr)
      
      allcombn <- function(...) {
        out <- combinat::permn(list(...), expand.grid, stringsAsFactors = FALSE)
        out <- vapply(out, purrr::lift_dl(paste), character(1L), sep = ".*", collapse = "|")
        paste0(out, collapse = "|")
      }
      

      使用以下向量进行测试

      a <- c("chicken","turkey")
      b <- c("legs","wings")
      c <- c("x", "y", "z")
      

      输出

      > allcombn(a, b)
      [1] "chicken.*legs|turkey.*legs|chicken.*wings|turkey.*wings|legs.*chicken|wings.*chicken|legs.*turkey|wings.*turkey"
      
      > allcombn(a, b, c)
      [1] "chicken.*legs.*x|turkey.*legs.*x|chicken.*wings.*x|turkey.*wings.*x|chicken.*legs.*y|turkey.*legs.*y|chicken.*wings.*y|turkey.*wings.*y|chicken.*legs.*z|turkey.*legs.*z|chicken.*wings.*z|turkey.*wings.*z|chicken.*x.*legs|turkey.*x.*legs|chicken.*y.*legs|turkey.*y.*legs|chicken.*z.*legs|turkey.*z.*legs|chicken.*x.*wings|turkey.*x.*wings|chicken.*y.*wings|turkey.*y.*wings|chicken.*z.*wings|turkey.*z.*wings|x.*chicken.*legs|y.*chicken.*legs|z.*chicken.*legs|x.*turkey.*legs|y.*turkey.*legs|z.*turkey.*legs|x.*chicken.*wings|y.*chicken.*wings|z.*chicken.*wings|x.*turkey.*wings|y.*turkey.*wings|z.*turkey.*wings|x.*legs.*chicken|y.*legs.*chicken|z.*legs.*chicken|x.*wings.*chicken|y.*wings.*chicken|z.*wings.*chicken|x.*legs.*turkey|y.*legs.*turkey|z.*legs.*turkey|x.*wings.*turkey|y.*wings.*turkey|z.*wings.*turkey|legs.*x.*chicken|wings.*x.*chicken|legs.*y.*chicken|wings.*y.*chicken|legs.*z.*chicken|wings.*z.*chicken|legs.*x.*turkey|wings.*x.*turkey|legs.*y.*turkey|wings.*y.*turkey|legs.*z.*turkey|wings.*z.*turkey|legs.*chicken.*x|wings.*chicken.*x|legs.*turkey.*x|wings.*turkey.*x|legs.*chicken.*y|wings.*chicken.*y|legs.*turkey.*y|wings.*turkey.*y|legs.*chicken.*z|wings.*chicken.*z|legs.*turkey.*z|wings.*turkey.*z"
      

      【讨论】:

        【解决方案4】:

        我们可以使用rep 来做到这一点

        paste0(c(paste(rep(a, length(b)), b, sep =".*"),
               paste(rep(b, length(a)), a, sep=".*")), collapse="|")
        #[1] "chicken.*legs|turkey.*wings|chicken.*legs|turkey.*wings|legs.*chicken|wings.*turkey|legs.*chicken|wings.*turkey"
        

        数据

        a <- c("chicken","turkey")
        b <- c("legs","wings")
        

        【讨论】:

          猜你喜欢
          • 2011-05-16
          • 1970-01-01
          • 2018-11-11
          • 2015-08-11
          • 1970-01-01
          相关资源
          最近更新 更多