【问题标题】:east way to get all combinations in R from a list从列表中获取R中所有组合的东方式
【发布时间】:2014-11-20 19:41:27
【问题描述】:

我有下面的清单。

假设,我想要 group1 中的 1 个元素、group2 中的 2 个元素、group3 中的 3 个元素、第 4 - 6 组中的 1 个元素。如果不允许元素重复,那么获取所有不同元素组合的最类似于 R 的方法是什么。

例如: (A1, B1, B2, C1, C2, C3, D1, E1, F1) 可以,但(A1, B1, B1, C1, C2, C3, D1, E1, F1) 不行?

itemNames <- list(group1 = c("A1", "A2", "A3", "A4", "A5", "A6"),
                  group2 = c("B1", "B2", "B3", "B4", "B5", "B6"),
                  group3 = c("C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12"),
                  group4 = c("D1", "D2", "D3", "D4", "D5", "D6"),
                  group5 = c("E1", "E2", "E3", "E4"),
                  group6 = c("F1", "F2", "F3", "F4"))

显然,我可以用 9 个嵌套的 for 循环来做到这一点——浪费。我在玩melt 和reshape2,但还没有到任何地方。谢谢!

【问题讨论】:

  • 任何项目都可能属于多个组吗?
  • @blakeoft -- 没有。即使“价值”是,它仍然应该算作一个单独的实体。
  • 好的。 6组呢?我假设它也应该只有一次平局。
  • @blakeoft -- 是的。抱歉,我已经编辑了帖子。
  • 标题说“所有组合”,这将是很多。您的意思是可能是其中的随机样本吗?

标签: r list combinations


【解决方案1】:

您可以使用Map Reduce 功能组合。映射combn 以获取每个组的组合。然后使用不会展平的expand.grid 版本进行缩减。

expand.grid.XY <- function(X,Y) 
  cbind(X[rep(1:nrow(X),nrow(Y)),], Y[rep(1:nrow(Y),each=nrow(X)),])

combos <- function(items,reps)
  Reduce(expand.grid.XY, Map(function(...) t(combn(...)),items,reps))

dim(combos(itemNames,c(1,2,3,1,1,1)))
# [1] 1900800       9

【讨论】:

    【解决方案2】:

    另一个迭代

    ex <- c(1,2,3,1,1,1)
    
    lst <- lapply(seq(itemNames), function(i) 
                                 combn(itemNames[[i]], ex[i], toString))
    
    out <- do.call("expand.grid", lst)
    
    head(out)
    #  Var1   Var2       Var3 Var4 Var5 Var6
    #1   A1 B1, B2 C1, C2, C3   D1   E1   F1
    #2   A2 B1, B2 C1, C2, C3   D1   E1   F1
    #3   A3 B1, B2 C1, C2, C3   D1   E1   F1
    #4   A4 B1, B2 C1, C2, C3   D1   E1   F1
    #5   A5 B1, B2 C1, C2, C3   D1   E1   F1
    #6   A6 B1, B2 C1, C2, C3   D1   E1   F1
    
    dim(out)
    #[1] 1900800       6
    
    prod(sapply(lst, length))
    #[1] 1900800
    

    【讨论】:

      【解决方案3】:
      itemNames <- list(group1 = c("A1","A2","A3","A4","A5","A6"),
                        group2 = c("B1","B2","B3","B4","B5","B6"),
                        group3 = c("C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12"),
                        group4 = c("D1","D2","D3","D4","D5","D6"),
                        group5 = c("E1","E2","E3","E4"),
                        group6 = c("F1","F2","F3","F4"))
      
      
      f <- function(x, n) {
        tmp <- t(combn(length(x),n))
        p <- function(...) paste(..., sep = ',')
        do.call('p', lapply(1:n, function(xx) as.matrix(x)[tmp[, xx]]))
      }
      
      tmp <- Map(f, itemNames, c(1,2,3,1,1,1))
      
      Reduce(`*`, Map(choose, sapply(tmp, length), 1))
      # [1] 1900800
      
      dim(out <- expand.grid(tmp))
      # [1] 1900800       6
      format(object.size(out), units = 'Mb')
      # [1] "43.5 Mb"
      
      head(out)
      #   group1 group2 group3 group4 group5 group6
      # 1     A1   B1B2 C1C2C3     D1     E1     F1
      # 2     A2   B1B2 C1C2C3     D1     E1     F1
      # 3     A3   B1B2 C1C2C3     D1     E1     F1
      # 4     A4   B1B2 C1C2C3     D1     E1     F1
      # 5     A5   B1B2 C1C2C3     D1     E1     F1
      # 6     A6   B1B2 C1C2C3     D1     E1     F1
      
      out <- apply(out, 1, paste0, collapse = ',')
      
      (out <- strsplit(out, ','))[1:5]
      # [[1]]
      # [1] "A1" "B1" "B2" "C1" "C2" "C3" "D1" "E1" "F1"
      # 
      # [[2]]
      # [1] "A2" "B1" "B2" "C1" "C2" "C3" "D1" "E1" "F1"
      # 
      # [[3]]
      # [1] "A3" "B1" "B2" "C1" "C2" "C3" "D1" "E1" "F1"
      # 
      # [[4]]
      # [1] "A4" "B1" "B2" "C1" "C2" "C3" "D1" "E1" "F1"
      # 
      # [[5]]
      # [1] "A5" "B1" "B2" "C1" "C2" "C3" "D1" "E1" "F1"
      

      没有重复:

      any(duplicated(out))
      # [1] FALSE 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 2015-02-06
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多