r - R 中两个向量之间的所有可能对,无需替换

标签 r

我希望创建一个包含两个向量之间所有可能的对组合的列表。例如,如果我有 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/

相关文章:

r - 如何测试 R 对象是否是命名的数值向量?

regex - 标签正则表达式,在 url 中保留#

r - 如何在ggplot2图例中使用下标[R]

r - 如何阻止 RStudio 在保存 R Markdown 文档时渲染 nb.html

r - 有条件地将两个大型数据集的多列中的元素相互匹配

R data.table 在进行跨类别聚合时快速追加列总数的方法?

r - 根据 R 中的条件向绘图添加纹理

r - 循环中数据处理的问题

r - 在 R data.table 中,根据另一列的值乘以列名

r - tibble::add_row 到嵌套 tibble 在 tidyr 1.0.0 下抛出错误