R-向量的所有匹配对';s元素
我希望识别向量元素的所有可能成对匹配。现在我不会计算向量的元素数,所以长度(向量)=n,但我只知道n是偶数。顺序并不重要,但每次,这些对都需要相加到初始向量R-向量的所有匹配对';s元素,r,R,我希望识别向量元素的所有可能成对匹配。现在我不会计算向量的元素数,所以长度(向量)=n,但我只知道n是偶数。顺序并不重要,但每次,这些对都需要相加到初始向量 举一个例子,如果n个元素的每个有序配对(其中n是偶数)等价于(1:n)%%(n/2)。此外,由于成对的顺序无关紧要,等于标签的排列实际上是等价的。例如,c(1,1,0,0)相当于c(0,0,1,1)——它们都将前两个元素配对在一起,最后两个元素配对在一起。因此,我们可以通过展开每个置换,然后按照它们出现的顺序重新标记每个置换的元素,然后从结
举一个例子,如果n个元素的每个有序配对(其中n是偶数)等价于
(1:n)%%(n/2)
。此外,由于成对的顺序无关紧要,等于标签的排列实际上是等价的。例如,c(1,1,0,0)
相当于c(0,0,1,1)
——它们都将前两个元素配对在一起,最后两个元素配对在一起。因此,我们可以通过展开每个置换,然后按照它们出现的顺序重新标记每个置换的元素,然后从结果中只取唯一的元素来获得唯一集:
library(magrittr)
library(combinat)
all_pairings <- function(n) {
if (n %% 2 != 0)
stop("n must be even")
allperms <- permn((1:n) %% (n/2))
allperms %<>% lapply(. %>% factor(levels=unique(.)) %>% as.numeric)
unique(allperms)
}
要实际获取配对,请使用split
功能:
> lapply(all_pairings(4), split, x=letters[1:n])
[[1]]
[[1]]$`1`
[1] "a" "c"
[[1]]$`2`
[1] "b" "d"
[[2]]
[[2]]$`1`
[1] "a" "d"
[[2]]$`2`
[1] "b" "c"
[[3]]
[[3]]$`1`
[1] "a" "b"
[[3]]$`2`
[1] "c" "d"
如果您只需要唯一配对的数量,而不需要完整的配对列表,那么有一个明确的公式:
在这种情况下,N个元素的唯一对的公式是factorial(N)/2^(N/2)/factorial(N/2)
。第一项表示所有排列,第二项表示由于对内等效重新排序而产生的冗余,第三项表示由于对的重新排序而产生的冗余
num_pairings <- function(n) {
if (any(n %% 2 != 0))
stop("n must be even")
factorial(n) / (2^(n/2)) / factorial(n/2)
}
> n <- seq(2,20, by=2); data.frame(n=n, NumPairings=num_pairings(n))
data.frame with 10 rows and 2 columns
n NumPairings
<numeric> <numeric>
1 2 1
2 4 3
3 6 15
4 8 105
5 10 945
6 12 10395
7 14 135135
8 16 2027025
9 18 34459425
10 20 654729075
num\u pairings n对于您的特定示例,您可以执行类似于res的操作,但对我来说唯一有意义的功能是类似于vecfunc的功能。我完全搞不清楚,在您的示例x
> lapply(all_pairings(4), split, x=letters[1:n])
[[1]]
[[1]]$`1`
[1] "a" "c"
[[1]]$`2`
[1] "b" "d"
[[2]]
[[2]]$`1`
[1] "a" "d"
[[2]]$`2`
[1] "b" "c"
[[3]]
[[3]]$`1`
[1] "a" "b"
[[3]]$`2`
[1] "c" "d"
num_pairings <- function(n) {
if (any(n %% 2 != 0))
stop("n must be even")
factorial(n) / (2^(n/2)) / factorial(n/2)
}
> n <- seq(2,20, by=2); data.frame(n=n, NumPairings=num_pairings(n))
data.frame with 10 rows and 2 columns
n NumPairings
<numeric> <numeric>
1 2 1
2 4 3
3 6 15
4 8 105
5 10 945
6 12 10395
7 14 135135
8 16 2027025
9 18 34459425
10 20 654729075