我希望共享一个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列矩阵中)。
答案 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)