R – 如何计算对的组合?
R – How to calculate combinations of pairs?
如何根据多个项目 (n) 计算 R 中所有可能的对组合?我可以用 (n-1)*(n-3)*(n-5)*…
计算出可能的组合数,但是如何获得组合本身?
比如我有
x <- c("A", "B", "C", "D")
这会形成 4-1=3
对组合,所以我想要类似
的东西
("AB","CD")
("AC","BD")
("AD","BC")
非常感谢!
为此,您可以使用 combn
或 expand.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"
首先,让我们得到所有的对:
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"
如何根据多个项目 (n) 计算 R 中所有可能的对组合?我可以用 (n-1)*(n-3)*(n-5)*…
计算出可能的组合数,但是如何获得组合本身?
比如我有
x <- c("A", "B", "C", "D")
这会形成 4-1=3
对组合,所以我想要类似
("AB","CD")
("AC","BD")
("AD","BC")
非常感谢!
为此,您可以使用 combn
或 expand.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"
首先,让我们得到所有的对:
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"