R:如何获得 2 个向量的唯一成对组合
R: how to obtain unique pairwise combinations of 2 vectors
x = 1:3
y = 1:3
> expand.grid(x = 1:3, y = 1:3)
x y
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
6 3 2
7 1 3
8 2 3
9 3 3
使用 expand.grid
给了我所有的组合。但是,我只想进行成对比较,也就是说,我不想比较 1 对 1、2 对、2 或 3 对 3。此外,我只想保留唯一对,即我想保留1 对 2(而不是 2 对 1)。
综上所述,对于上述x
和y
,我想要以下3对组合:
x y
1 1 2
2 1 3
3 2 3
同样,对于 x = y = 1:4
,我想要以下成对组合:
x y
1 1 2
2 1 3
3 1 4
4 2 3
5 2 4
6 3 4
我们可以使用combn
f1 <- function(x) setNames(as.data.frame(t(combn(x, 2))), c("x", "y"))
f1(1:3)
# x y
#1 1 2
#2 1 3
#3 2 3
f1(1:4)
# x y
#1 1 2
#2 1 3
#3 1 4
#4 2 3
#5 2 4
#6 3 4
使用data.table,
library(data.table)
x <- 1:4
y <- 1:4
CJ(x, y)[x < y]
x y
1: 1 2
2: 1 3
3: 1 4
4: 2 3
5: 2 4
6: 3 4
实际上你已经非常接近期望的输出了。您可能还需要 subset
> subset(expand.grid(x = x, y = y), x < y)
x y
4 1 2
7 1 3
8 2 3
这是另一个选项,但代码更长
v <- letters[1:5] # dummy data vector
mat <- diag(length(v))
inds <- upper.tri(mat)
data.frame(
x = v[row(mat)[inds]],
y = v[col(mat)[inds]]
)
这给出了
x y
1 a b
2 a c
3 b c
4 a d
5 b d
6 c d
7 a e
8 b e
9 c e
10 d e
x = 1:3
y = 1:3
> expand.grid(x = 1:3, y = 1:3)
x y
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
6 3 2
7 1 3
8 2 3
9 3 3
使用 expand.grid
给了我所有的组合。但是,我只想进行成对比较,也就是说,我不想比较 1 对 1、2 对、2 或 3 对 3。此外,我只想保留唯一对,即我想保留1 对 2(而不是 2 对 1)。
综上所述,对于上述x
和y
,我想要以下3对组合:
x y
1 1 2
2 1 3
3 2 3
同样,对于 x = y = 1:4
,我想要以下成对组合:
x y
1 1 2
2 1 3
3 1 4
4 2 3
5 2 4
6 3 4
我们可以使用combn
f1 <- function(x) setNames(as.data.frame(t(combn(x, 2))), c("x", "y"))
f1(1:3)
# x y
#1 1 2
#2 1 3
#3 2 3
f1(1:4)
# x y
#1 1 2
#2 1 3
#3 1 4
#4 2 3
#5 2 4
#6 3 4
使用data.table,
library(data.table)
x <- 1:4
y <- 1:4
CJ(x, y)[x < y]
x y
1: 1 2
2: 1 3
3: 1 4
4: 2 3
5: 2 4
6: 3 4
实际上你已经非常接近期望的输出了。您可能还需要 subset
> subset(expand.grid(x = x, y = y), x < y)
x y
4 1 2
7 1 3
8 2 3
这是另一个选项,但代码更长
v <- letters[1:5] # dummy data vector
mat <- diag(length(v))
inds <- upper.tri(mat)
data.frame(
x = v[row(mat)[inds]],
y = v[col(mat)[inds]]
)
这给出了
x y
1 a b
2 a c
3 b c
4 a d
5 b d
6 c d
7 a e
8 b e
9 c e
10 d e