R - 如何计算对的组合?

问题描述 投票:-1回答:2

从许多项目(n),我如何计算R中所有可能的对组合?我可以用(n-1)*(n-3)*(n-5)*…计算可能组合的数量,但是如何自己获得这些组合呢?

例如,我有

x <- c("A", "B", "C", "D") 

这将使4-1=3成对组合,所以我希望有类似的东西

("AB","CD")
("AC","BD")
("AD","BC")

非常感谢!

r combinatorics
2个回答
5
投票

首先,让我们得到所有成对的对:

dat = t(combn(combn(x, 2, paste, collapse=""), 2))
     [,1] [,2]
 [1,] "AB" "AC"
 [2,] "AB" "AD"
 [3,] "AB" "BC"
 [4,] "AB" "BD"
 [5,] "AB" "CD"
 [6,] "AC" "AD"
 [7,] "AC" "BC"
 [8,] "AC" "BD"
 [9,] "AC" "CD"
[10,] "AD" "BC"
[11,] "AD" "BD"
[12,] "AD" "CD"
[13,] "BC" "BD"
[14,] "BC" "CD"
[15,] "BD" "CD"

我们现在拥有所有成对的对。但看起来你只想要成对的对,每个字母只出现一次。下面的代码标识满足此条件的行(尽管看起来代码比它需要的更复杂)。

dat[sapply(strsplit(apply(dat, 1, paste, collapse=""), ""), function(i) length(unique(i)) == 4), ]
     [,1] [,2]
[1,] "AB" "CD"
[2,] "AC" "BD"
[3,] "AD" "BC"

1
投票

为此你可以使用combnexpand.grid

x <- c("A","B","C","D") 

expand.grid(x, x) # generates both way combinations

   Var1 Var2
1     A    A
2     B    A
3     C    A
4     D    A
5     A    B
6     B    B
7     C    B
8     D    B
9     A    C
10    B    C
11    C    C
12    D    C
13    A    D
14    B    D
15    C    D
16    D    D

t(combn(x, 2)) # order does not matter

     [,1] [,2]
[1,] "A"  "B" 
[2,] "A"  "C" 
[3,] "A"  "D" 
[4,] "B"  "C" 
[5,] "B"  "D" 
[6,] "C"  "D" 
© www.soinside.com 2019 - 2024. All rights reserved.