首页 > 解决方案 > 从向量中获取唯一组合的网格

问题描述

我想从序列向量返回一个具有唯一行的网格。我正在寻找一个通用的解决方案,这样我就可以在一个向量中传递任意数量的序列。我不知道这个的术语,所以我该怎么做呢?

例子

num <- 3
v <- c(seq(1, num, 1))

期望的输出

1 2 3
2 3 1
3 1 2

第二列和第三列可以切换:

1 3 2
2 1 3
3 2 1

我尝试进行操作expand.grid(),但它需要排序和过滤,这似乎过多。

标签: r

解决方案


这是一种解决方案(列顺序不同,但想法成立):

n = 3
sweep(replicate(n, 1:n), 2, 1:n, "+") %% n + 1

     [,1] [,2] [,3]
[1,]    3    1    2
[2,]    1    2    3
[3,]    2    3    1

说明

replicate将首先创建一个矩阵,其中每一行是1:n

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3

然后我使用该sweep函数添加1到第 12列、第 23列和第 3 列:

     [,1] [,2] [,3]
[1,]    2    3    4
[2,]    3    4    5
[3,]    4    5    6

此时,您可以对矩阵进行取模,然后相加1得到所需的矩阵。

编辑:如果您需要与上面相同的列顺序,可以这样做

(sweep(replicate(n, 1:n), 2, 1:n, "+") + 1) %% n + 1

推荐阅读