Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-向量的所有匹配对';s元素_R - Fatal编程技术网

R-向量的所有匹配对';s元素

R-向量的所有匹配对';s元素,r,R,我希望识别向量元素的所有可能成对匹配。现在我不会计算向量的元素数,所以长度(向量)=n,但我只知道n是偶数。顺序并不重要,但每次,这些对都需要相加到初始向量 举一个例子,如果n个元素的每个有序配对(其中n是偶数)等价于(1:n)%%(n/2)。此外,由于成对的顺序无关紧要,等于标签的排列实际上是等价的。例如,c(1,1,0,0)相当于c(0,0,1,1)——它们都将前两个元素配对在一起,最后两个元素配对在一起。因此,我们可以通过展开每个置换,然后按照它们出现的顺序重新标记每个置换的元素,然后从结

我希望识别向量元素的所有可能成对匹配。现在我不会计算向量的元素数,所以长度(向量)=n,但我只知道n是偶数。顺序并不重要,但每次,这些对都需要相加到初始向量


举一个例子,如果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