r - 在 R 中将元素列表拆分为两个唯一列表(并获取所有组合)
问题描述
我有一个元素列表(我的真实列表有 11 个元素,这只是一个示例):
x <- c(1, 2, 3)
并希望将它们分成两个列表(使用所有条目),但我希望返回该列表的所有可能组合,例如:
(1,2)(3) & (1)(2,3) & (2)(1,3)
有谁知道为更复杂的列表执行此操作的有效方法?
在此先感谢您的帮助!
解决方案
包含 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()
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
推荐阅读
- git - git clone 子模块的子模块
- html - 如何从角度 8 的对象中获取索引并删除元素?
- elasticsearch - 使用 Elastic ECK 设置 Ingress 时遇到问题
- asp.net-core - 使用 itfoxtec-identity-saml2 时动态刷新用户声明
- python - 从 PyParsing 中的多行引用字符串中删除 \n
- angular - 在 angular + jest 中运行单元测试时如何正确模拟库“Twemoji”?
- python-3.x - 我正在尝试运行以下程序,但是当我运行时出现“NameError:名称“年龄”未定义”
- mysql - Mysql ORDER BY FIELD 有没有办法多次获得相同的值?
- ios - 如何解锁具有相同 IAP 产品 ID 的不同产品?
- javascript - 在 webCaht UI 中重置对话