首页 > 解决方案 > 在 R 中将元素列表拆分为两个唯一列表(并获取所有组合)

问题描述

我有一个元素列表(我的真实列表有 11 个元素,这只是一个示例):

x <- c(1, 2, 3)

并希望将它们分成两个列表(使用所有条目),但我希望返回该列表的所有可能组合,例如:

(1,2)(3) & (1)(2,3) & (2)(1,3)

有谁知道为更复杂的列表执行此操作的有效方法?

在此先感谢您的帮助!

标签: rlistcombinations

解决方案


包含 3 个元素的列表:

vec <- 1:3

请注意,对于每个元素,我们有两种可能性:它在第一次拆分或第二次拆分中。因此,我们定义了一个包含所有可能拆分(以行为单位)的矩阵,使用expand.grid它产生所有可能的组合:

groups <- as.matrix(expand.grid(rep(list(1:2), length(vec))))

但是,这会将组翻转为不同拆分的情况。还将包括所有观察结果都在同一组中的场景(但只有 2 个)。

如果要删除它们,我们需要从groups矩阵中删除只有一组(2 条这样的线)的线以及以相同方式拆分向量的所有线,仅切换组。

一组条目位于顶部和底部,因此删除它们很容易:

groups <- groups[-c(1, nrow(groups)),]

重复的条目有点棘手。但请注意,我们可以通过删除第一组所在的所有行来摆脱它们2。实际上,这将要求第一个元素始终分配给组 1。

groups <- groups[groups[,1]==1,]

然后工作是使用矩阵中的每一行拆分我们拥有的列表groups。为此,我们使用我们的列表和矩阵的每一行Map调用函数:split()vecgroups

splits <- Map(split, list(vec), split(groups, row(groups)))

> splits
[[1]]
[[1]]$`1`
[1] 1 3

[[1]]$`2`
[1] 2


[[2]]
[[2]]$`1`
[1] 1 2

[[2]]$`2`
[1] 3


[[3]]
[[3]]$`1`
[1] 1

[[3]]$`2`
[1] 2 3

推荐阅读