获取R中的所有组合,允许重复
Posted
技术标签:
【中文标题】获取R中的所有组合,允许重复【英文标题】:Getting all combinations in R, repetition allowed 【发布时间】:2015-10-08 03:07:29 【问题描述】:内置的combn
只给出了一半的组合:
> t(combn(1:5, 2))
[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 1 4
[4,] 1 5
[5,] 2 3
[6,] 2 4
[7,] 2 5
[8,] 3 4
[9,] 3 5
[10,] 4 5
例如,没有 (1,1) 也没有 (2,1)。
如何获得所有组合?
【问题讨论】:
可能是expand.grid(rep(list(1:5),2))
您也可以使用data.table
中的CJ
进行快速组合。
combn
根据定义只是给你组合矩阵的上三角,以避免重复。不是对角线,也不是下三角形。
仅供参考,这称为1:5
和1:5
的笛卡尔积。
【参考方案1】:
正如@akrun 所说,看起来expand.grid
会做到。
> expand.grid(rep(list(1:5), 2))
Var1 Var2
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 1 2
7 2 2
8 3 2
9 4 2
10 5 2
11 1 3
12 2 3
13 3 3
14 4 3
15 5 3
16 1 4
17 2 4
18 3 4
19 4 4
20 5 4
21 1 5
22 2 5
23 3 5
24 4 5
25 5 5
【讨论】:
【参考方案2】:您可以使用merge
获得笛卡尔积:
merge(1:5, 1:5)
输出:
x y
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 1 2
7 2 2
8 3 2
9 4 2
10 5 2
11 1 3
12 2 3
13 3 3
14 4 3
15 5 3
16 1 4
17 2 4
18 3 4
19 4 4
20 5 4
21 1 5
22 2 5
23 3 5
24 4 5
25 5 5
使用sqldf
:
df1 <- data.frame(a = 1:5)
df2 <- df1
sqldf("SELECT df1.a, df2.a FROM df1
CROSS JOIN df2")
【讨论】:
【参考方案3】:这实际上被称为具有重复元素的排列。除了给定的建议,您还可以使用gtools::permutations
函数:
gtools::permutations(5, 2, 1:5, repeats.allowed=TRUE)
【讨论】:
我认为这应该是gtools::combinations(5, 2, 1:5, repeats.allowed=TRUE)
以遵循允许重复的组合定义,即 \binomn+k-1k以上是关于获取R中的所有组合,允许重复的主要内容,如果未能解决你的问题,请参考以下文章
获取字符串或组合的所有可能排列,包括 Java 中的重复字符