我有以下数据列表.

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()函数不起作用,因为它没有考虑我的分组变量.

推荐答案

Update

似乎我之前误解了你的问题,但现在我想我明白了:

lst <- expand.grid(Input)

res <- Filter(
    length,
    combn(
        1:nrow(lst),
        min(lengths(Input)),
        function(x) {
            if (all(colSums(apply(lst[x, ], 2, duplicated)) == 0)) {
                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

Previous Answer

您可以使用expand.grid+combntry 下面的代码

lst <- lapply(Input, combn, min(lengths(Input)))
res <- do.call(
    rbind,
    apply(
        expand.grid(lapply(lst, function(v) seq(ncol(v)))),
        1,
        function(k) {
            expand.grid(
                Map(
                    function(x, y) x[, y],
                    lst,
                    k
                )
            )
        }
    )
)

这给了

> res
   Var1 Var2 Var3
1     1    3    5
2     2    3    5
3     1    4    5
4     2    4    5
5     1    3    6
6     2    3    6
7     1    4    6
8     2    4    6
9     1    3    5
10    2    3    5
11    1    4    5
12    2    4    5
13    1    3    7
14    2    3    7
15    1    4    7
16    2    4    7
17    1    3    6
18    2    3    6
19    1    4    6
20    2    4    6
21    1    3    7
22    2    3    7
23    1    4    7
24    2    4    7

R相关问答推荐

如何将y轴设置为在ggplot 2中x=0处与x轴相交?

如何判断R中一列的值是否在所有其他列中重复?

基于2行删除重复项指定每列要执行的操作

R数据帧中的布尔加法会产生布尔值而不是整值

手工PCA上的载体与输出双图不匹配

如何创建构成多个独立列条目列表的收件箱框列?

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

如何使用stat_extract_all正确提取我的目标值?

x[[1]]中的错误:脚注越界

判断字符串中数字的连续性

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

如何使用列表中多个列表中的第一条记录创建数据框

根据类别合并(汇总)某些行

plotly hover文本/工具提示在shiny 中不起作用

将重复项转换为NA

如何用书面利率绘制geom_bar图

在GG图中绘制射线的自动程序

如何在科学记数法中显示因子

在多页PDF中以特定布局排列的绘图列表不起作用

根据另一列中的值和条件查找新列的值