我有以下数据列表。
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/