我希望创建一个包含两个向量之间所有可能的对组合的列表。例如,如果我有 v1 = c('A', 'B', 'C')
和 v2 = c('X', 'Y', 'Z')
,我不只是在寻找 expand.grid(v1, v2)
。我想将 v1
的每个元素与 v2
的元素配对而不用替换。
所以我想要类似的东西
AX, BY, CZ
AX, BZ, CY
AY、BX、CZ
AY,BZ,CX
AZ、BX、CY
AZ、BY、CX
理想情况下,我也希望能够标记每个组合(因此 AX、BY、CZ 是一个组合,AX、BZ、CY 是下一个组合,等等)。所以理想的输出应该是这样的
my_df <- data.frame(
var1 = c(A, B, C, A, B, C, A, B, C, A, B, C, A, B, C, A, B, C),
var2 = c(X, Y, Z, X, Z, Y, Y, X, Z, Y, Z, X, Z, X, Y, Z, Y, X),
match = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6)
)
最佳答案
这似乎是一个排列问题,可能会像下面这样解决
> library(pracma)
> paste0(v1, t(perms(v2)))
[1] "AZ" "BY" "CX" "AZ" "BX" "CY" "AY" "BZ" "CX" "AY" "BX" "CZ" "AX" "BY" "CZ"
[16] "AX" "BZ" "CY"
或
out <- data.frame(
Var1 = v1,
Var2 = c(t(perms(v2))),
Match = ceiling(seq(factorial(length(v2)) * length(v2)) / length(v1))
)
给出
> out
Var1 Var2 Match
1 A Z 1
2 B Y 1
3 C X 1
4 A Z 2
5 B X 2
6 C Y 2
7 A Y 3
8 B Z 3
9 C X 3
10 A Y 4
11 B X 4
12 C Z 4
13 A X 5
14 B Y 5
15 C Z 5
16 A X 6
17 B Z 6
18 C Y 6
关于r - R 中两个向量之间的所有可能对,无需替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67462470/