r - 确定所有组合但使用分组变量

标签 r grouping combinations combinatorics

我有以下数据列表。

Input <- list(c("1", "2"), c("3", "4"), c("5", "6", "7"))

我想从每个列表元素中取出一个项目并将它们组合成一个向量。然后,从每个列表元素中的剩余项目中,我想重复这个过程,从每个列表元素中取出另一个项目并将它们组合到另一个向量中。我想重复这些步骤,直到达到某个预定值(在本例中为 2;2 是最大数字,因为它恰好是 Input 列表中每个列表元素的最小长度).

有很多可能的方法可以做到这一点,我希望找到一种可以返回所有可能性的方法,如下面的 Output 列表。我真的不关心输出的形式,只要它包含相同的信息即可。

Output <- lapply(list(rbind(as.character(c(1, 3, 5)), as.character(c(2, 4, 6))), rbind(as.character(c(1, 3, 5)), as.character(c(2, 4, 7))), rbind(as.character(c(1, 3, 6)), as.character(c(2, 4, 5))), rbind(as.character(c(1, 3, 6)), as.character(c(2, 4, 7))), rbind(as.character(c(1, 3, 7)), as.character(c(2, 4, 5))), rbind(as.character(c(1, 3, 7)), as.character(c(2, 4, 6))), rbind(as.character(c(1, 4, 5)), as.character(c(2, 3, 6))), rbind(as.character(c(1, 4, 5)), as.character(c(2, 3, 7))), rbind(as.character(c(1, 4, 6)), as.character(c(2, 3, 5))), rbind(as.character(c(1, 4, 6)), as.character(c(2, 3, 7))), rbind(as.character(c(1, 4, 7)), as.character(c(2, 3, 5))), rbind(as.character(c(1, 4, 7)), as.character(c(2, 3, 6)))), function (x) {
  lapply(as.data.frame(t(x)), function (y) {
    y
  })
})

这个例子非常小。实际上,我可能会有更多组(Input 列表中的列表元素)和每个组中的更多元素,并且组的大小可能与我的示例中的不同。是否有一种有效的、程序化的方式来执行此操作?我很想看到使用 base 函数的解决方案,但我对任何事情都持开放态度。 expand.grid() 函数不起作用,因为它没有考虑我的分组变量。

最佳答案

你可以试试

lst <- expand.grid(Input)
minlen <- min(lengths(Input))
res <- Filter(
    length,
    combn(
        1:nrow(lst),
        minlen,
        function(x) {
            if (all(!apply(lst[x, ], 2, anyDuplicated))) {
                lst[x, ]
            }
        },
        simplify = FALSE
    )
)

给出

> res
[[1]]
  Var1 Var2 Var3
1    1    3    5
8    2    4    6

[[2]]
   Var1 Var2 Var3
1     1    3    5
12    2    4    7

[[3]]
  Var1 Var2 Var3
2    2    3    5
7    1    4    6

[[4]]
   Var1 Var2 Var3
2     2    3    5
11    1    4    7

[[5]]
  Var1 Var2 Var3
3    1    4    5
6    2    3    6

[[6]]
   Var1 Var2 Var3
3     1    4    5
10    2    3    7

[[7]]
  Var1 Var2 Var3
4    2    4    5
5    1    3    6

[[8]]
  Var1 Var2 Var3
4    2    4    5
9    1    3    7

[[9]]
   Var1 Var2 Var3
5     1    3    6
12    2    4    7

[[10]]
   Var1 Var2 Var3
6     2    3    6
11    1    4    7

[[11]]
   Var1 Var2 Var3
7     1    4    6
10    2    3    7

[[12]]
  Var1 Var2 Var3
8    2    4    6
9    1    3    7

关于r - 确定所有组合但使用分组变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72438813/

相关文章:

r - 以毫米 (R) 为单位定义绘图元素大小

php - 选择所有匹配的两个字段并用 mysql 按这两个字段分组

python - 使用递归从字符列表打印 n 长度组合

java - 一组中所有对的组合

r - 将 strsplit 应用于多列

r - GADM-Maps越野比较图

r - tm 包中不再支持 Dictionary()。如何修改代码?

javascript - 在之前和之后的值中提取数组中的元素并将其分组

r - 对向量/列表的元素进行分组的函数

python - 计算 itertools.product() 的第 n 个结果