R中的简单组合学

时间:2011-11-08 13:39:56

标签: r combinatorics

我希望共享一个R函数,用于查找单个向量的元素之间所有可能的唯一无向组合:

combi <- function(vec1)
{
  si <- length(vec1)
  first <- rep(vec1, (si-1):0)
  secR <- rev(vec1)
  second <- secR[sequence(1:(si-1))]
  second <- rev(second)
  combi <- matrix(cbind(first, second), ncol = 2)
  return(combi)
}

并询问是否有更简单的方法吗? (我需要将结果放在一个2列矩阵中)。

4 个答案:

答案 0 :(得分:10)

嗯,有一个内置的combn函数:

t(combn(vec1,2))

你的看起来更快,可能是因为combn试图解决一个更普遍的问题(??):

> library(rbenchmark)
> v <- 1:20
> benchmark(combi(v),t(combn(v,2)))
            test replications elapsed relative user.self sys.self
1       combi(v)          100   0.005      1.0     0.004    0.000   
2 t(combn(v, 2))          100   0.044      8.8     0.040    0.004   

答案 1 :(得分:4)

combn包中有一个基本的R函数utils,据我所知,它给出了相同的(如果是转置的)结果。不同之处在于combn更灵活,因为它还会计算长度不是2的组合。

combi(1:5)
      [,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

使用基础R combn

combn(1:5, 2)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    2    2    2    3    3     4
[2,]    2    3    4    5    3    4    5    4    5     5

计算长度为3的组合:

combn(1:5, 3)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    2    2    2     3
[2,]    2    2    2    3    3    4    3    3    4     4
[3,]    3    4    5    4    5    5    4    5    5     5

答案 2 :(得分:2)

combinat。很多组合,排列和所有这些的工具。

答案 3 :(得分:1)

感谢发帖。一些性能调整。

一个。我在使用rep.int代替或代表时,首先找出索引。

湾我用了

second <- secR[rev(sequence(1:(si-1)))]

而不是

second <- secR[sequence(1:(si-1))]
second <- rev(second)

℃。我用了

matrix(c(first, second), ncol = 2)

而不是

matrix(cbind(first, second), ncol = 2)