这个问题与这个问题非常相似,但我不想把每个原始组中的一个项目放在每个输出组中,而是希望每个原始组中的多个项目放在每个输出组中。
我有以下数据。
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")))
我在这里问的问题非常相似,除了那个问题,我只把每个原始组中的一个项目放入每个新组。在这里,我想有一个选择,把一个以上的项目从每个原始组到每个新的组。
可能你可以定义一个函数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"
这相当棘手,而且相当慢,因为指定的三组有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组。到目前为止,我所尝试的并没有真正的帮助: 我很高