获取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:51: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中的所有组合,允许重复的主要内容,如果未能解决你的问题,请参考以下文章

R中不重复的组合

获取字符串或组合的所有可能排列,包括 Java 中的重复字符

python:随机播放字符串中的字符以获取所有可能的字符串组合[重复]

R从n个元素的字符向量中生成大小为m的所有可能组合[重复]

迭代获取数据框列的最大值,加一并重复 r 中的所有行

从 n 个元素生成长度为 r 的组合而不重复或排列的函数的时间复杂度是多少?