当前位置: 首页 > 知识库问答 >
问题:

使用分组变量确定项目的所有可能组合

丰赞
2023-03-14

这个问题与这个问题非常相似,但我不想把每个原始组中的一个项目放在每个输出组中,而是希望每个原始组中的多个项目放在每个输出组中。

我有以下数据。

list1 <- list(Group_1 = c("1", "2", "3", "4", "5", "6"), Group_2 = c("13", "14", "15", "16", "17", "18"), Group_3 = c("19", "20", "21", "22", "23", "24", "25"))
Number_of_Items_From_Each_Original_Group_to_End_up_in_Each_Output_Group <- 2

Group_1包含6个项目,Group_2包含6个项目,Group_3包含7个项目。基于这些初始组,我想将项目放入3个新组,确保每个新组包含相同数量(2或Number_of_Items_From_Each_Original_Group_to_End_up_in_Each_Output_Group)的项目。此外,这3个新组中的每一个都不能重复这些项目——每个项目只能为每个新组使用一次。例如,一个可能的输出可能是下面的这个输出。

(list(New_Group_1 = c("1", "2", "13", "14", "19", "20"), New_Group_2 = c("3", "4", "15", "16", "21", "22"), New_Group_3 = c("5", "6", "17", "18", "23", "24")))

实际上,我想生成一个输出列表,显示每个可能的输出(每个可能的组合)。对于每个列表元素,应该有三个新组,每个组中应该有不同的项。例如,除上述解决方案外,另一个解决方案可以是以下内容。

(list(New_Group_1 = c("3", "4", "13", "14", "19", "20"), New_Group_2 = c("5", "6", "15", "16", "21", "22"), New_Group_3 = c("1", "2", "17", "18", "23", "24")))

我在这里问的问题非常相似,除了那个问题,我只把每个原始组中的一个项目放入每个新组。在这里,我想有一个选择,把一个以上的项目从每个原始组到每个新的组。

共有2个答案

慎俊艾
2023-03-14

可能你可以定义一个函数f,如下所示(它生成由v中的n个元素分组的所有排列)

f <- function(v, n = 2) {
    if (length(v) < n) {
        return(list(NULL))
    }
    if (length(v) == n) {
        return(list(v))
    }
    x <- combn(v, n, simplify = FALSE)
    unlist(lapply(x, function(p) Map(rbind, list(p), f(v[!v %in% p], n))), recursive = FALSE)
}

res <- apply(expand.grid(lapply(list1, f)), 1, function(x) asplit(do.call(cbind, x), 1))

结果的一个子集看起来像

> apply(head(expand.grid(lapply(list1, f))), 1, fun .... [TRUNCATED]
$`1`
$`1`[[1]]
[1] "1"  "2"  "13" "14" "19" "20"

$`1`[[2]]
[1] "3"  "4"  "15" "16" "21" "22"

$`1`[[3]]
[1] "5"  "6"  "17" "18" "23" "24"


$`2`
$`2`[[1]]
[1] "1"  "2"  "13" "14" "19" "20"

$`2`[[2]]
[1] "3"  "5"  "15" "16" "21" "22"

$`2`[[3]]
[1] "4"  "6"  "17" "18" "23" "24"


$`3`
$`3`[[1]]
[1] "1"  "2"  "13" "14" "19" "20"

$`3`[[2]]
[1] "3"  "6"  "15" "16" "21" "22"

$`3`[[3]]
[1] "4"  "5"  "17" "18" "23" "24"


$`4`
$`4`[[1]]
[1] "1"  "2"  "13" "14" "19" "20"

$`4`[[2]]
[1] "4"  "5"  "15" "16" "21" "22"

$`4`[[3]]
[1] "3"  "6"  "17" "18" "23" "24"


$`5`
$`5`[[1]]
[1] "1"  "2"  "13" "14" "19" "20"

$`5`[[2]]
[1] "4"  "6"  "15" "16" "21" "22"

$`5`[[3]]
[1] "3"  "5"  "17" "18" "23" "24"


$`6`
$`6`[[1]]
[1] "1"  "2"  "13" "14" "19" "20"

$`6`[[2]]
[1] "5"  "6"  "15" "16" "21" "22"

$`6`[[3]]
[1] "3"  "4"  "17" "18" "23" "24"
宋航
2023-03-14

这相当棘手,而且相当慢,因为指定的三组有23625种可能的组合

n <- 2

all_pairs <- lapply(list1, function(group) {
  all_combs <- apply(combn(ncol(combn(length(group), n)), length(list1)), 
                     2,
        function(x) c(combn(length(group), n)[,x]), simplify = FALSE)
  
  all_combs[sapply(all_combs, function(x) !any(duplicated(x)))]
})

index_df <- do.call(expand.grid, lapply(all_pairs, function(x) seq(length(x))))

result <- apply(index_df, 1, function(x) {
  m <- t(sapply(seq_along(x), function(y) list1[[y]][all_pairs[[y]][[x[y]]]]))
  setNames(lapply(split(m, (seq_along(m)-1) %/% (length(list1) * n)),
         function(x) c(t(matrix(x, ncol = n)))), names(list1))
}, simplify = FALSE)

生成的列表如下所示:

head(result)
#> [[1]]
#> [[1]]$Group_1
#> [1] "1"  "2"  "13" "14" "19" "20"
#> 
#> [[1]]$Group_2
#> [1] "3"  "4"  "15" "16" "21" "22"
#> 
#> [[1]]$Group_3
#> [1] "5"  "6"  "17" "18" "23" "24"
#> 
#> 
#> [[2]]
#> [[2]]$Group_1
#> [1] "1"  "2"  "13" "14" "19" "20"
#> 
#> [[2]]$Group_2
#> [1] "3"  "5"  "15" "16" "21" "22"
#> 
#> [[2]]$Group_3
#> [1] "4"  "6"  "17" "18" "23" "24"
#> 
#> 
#> [[3]]
#> [[3]]$Group_1
#> [1] "1"  "2"  "13" "14" "19" "20"
#> 
#> [[3]]$Group_2
#> [1] "3"  "6"  "15" "16" "21" "22"
#> 
#> [[3]]$Group_3
#> [1] "4"  "5"  "17" "18" "23" "24"
#> 
#> 
#> [[4]]
#> [[4]]$Group_1
#> [1] "1"  "3"  "13" "14" "19" "20"
#> 
#> [[4]]$Group_2
#> [1] "2"  "4"  "15" "16" "21" "22"
#> 
#> [[4]]$Group_3
#> [1] "5"  "6"  "17" "18" "23" "24"
#> 
#> 
#> [[5]]
#> [[5]]$Group_1
#> [1] "1"  "3"  "13" "14" "19" "20"
#> 
#> [[5]]$Group_2
#> [1] "2"  "5"  "15" "16" "21" "22"
#> 
#> [[5]]$Group_3
#> [1] "4"  "6"  "17" "18" "23" "24"
#> 
#> 
#> [[6]]
#> [[6]]$Group_1
#> [1] "1"  "3"  "13" "14" "19" "20"
#> 
#> [[6]]$Group_2
#> [1] "2"  "6"  "15" "16" "21" "22"
#> 
#> [[6]]$Group_3
#> [1] "4"  "5"  "17" "18" "23" "24"

由reprex包(v2.0.1)于2022-06-09创建

 类似资料:
  • 我正在尝试构造一个程序,该程序将获取一个int({1,2,3})数组和一个长度值,并计算该数组的所有可能组合。 例如: 这将输出: 但是当我尝试在 for 循环中调用可能的梳子时,我不断收到堆栈溢出错误 }

  • 问题内容: 问题 步骤1 :给定数字列表,仅给定所需组的最终数量,生成所有可能的分组(按顺序)。 例如,如果我的数字列表是1到4,并且我想要2个最终组,则可能是: 步骤2 :对这些组执行算术运算。 例如,如果我们选择加法,则最终结果将是: 先验研究和类似问题 我已经在SO和其他地方看到了许多有关涉及可变 数量 组的问题的示例,这些问题利用范围和for循环,例如: 但这与我想要的相反-在那里,组的长

  • 问题内容: 我有一个项目{a,b,c,d}的列表,当我需要生成所有可能的组合时, 您可以选择任意数量的项目 顺序不重要(ab = ba) 空集不被考虑 如果我们抓住可能性,那就应该是 我使用了以下递归方法: 当数组大时,有没有更有效的方法? 问题答案: 将组合视为一个二进制序列,如果所有4个都存在,则得到1111,如果缺少第一个字母,则得到0111,依此类推。对于n个字母,我们将得到2 ^ n -

  • 我有下表: 对于两组中的每一组,我想返回所有可能的值组合。对于组1,例如,可能的组合是(A, B)、(A, C)、(A, D)、(B, C)、(B, D)、(C, D)、(A, B, C)、(B, D, C)、(C, A, B)。类似地,对于组2,它是(A, B)、(A, C)、(B, C)[备注:我不想考虑(1)只有一个值的组合,(2)所有值的组合和(3)没有值的组合。因此,对于n个不同的值,我

  • 我有亲戚 并想在PostgreSQL中加入它 所以我得到了所有可能的替换组合(即替换或多或少的笛卡尔积)。所以组1没有更新,组2只有B2,组3只有D2,组4都有B2和D2。 结尾应该是这样的,但应该对更多人开放(就像D1的额外D3) 编辑: 另一个可能的替换表可以是 可能会导致6组(我希望我没有忘记一个案例) 如果你有三个替代品,比如 这将导致8组。到目前为止,我所尝试的并没有真正的帮助: 我很高