我有一个元素列表(我的实际列表中有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)
有人知道做更复杂列表的有效方法吗?
在此先感谢您的帮助!
答案 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