在R中将元素列表拆分为两个唯一列表(并获得所有组合)

时间:2018-10-09 17:43:57

标签: r list combinations

我有一个元素列表(我的实际列表中有11个元素,这只是一个例子):

db.test.aggregate([
    // Duplicate each doc, one per points array element
    {$unwind: '$points'},

    // Remove the _id field to prompt regeneration as there are now duplicates
    {$project: {_id: 0}},

    // Output the resulting docs to a new collection, named 'newtest'
    {$out: 'newtest'}
])

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

x <- c(1, 2, 3)

有人知道做更复杂列表的有效方法吗?

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

包含3个元素的列表:

vec <- 1:3

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

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

但是,这会将组翻转为不同拆分的情况视为处理。此外,还将包括所有观测值都在同一组中的场景(但其中只有两个)。

如果要删除它们,我们需要从groups矩阵中删除仅包含一组的行(2条这样的行),并且所有以相同方式分割向量的行,仅切换组即可。

一组条目位于顶部和底部,因此轻松删除它们:

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

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

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

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

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