r - 从向量中获取唯一组合的网格
问题描述
我想从序列向量返回一个具有唯一行的网格。我正在寻找一个通用的解决方案,这样我就可以在一个向量中传递任意数量的序列。我不知道这个的术语,所以我该怎么做呢?
例子
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()
,但它需要排序和过滤,这似乎过多。
解决方案
这是一种解决方案(列顺序不同,但想法成立):
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
推荐阅读
- kotlin - 解构而不是 .bind() 在 Arrow Monad 理解中不起作用
- java - 无法使用改造 REST API,出现 IllegalStateException:请帮我调查
- c++ - 将struct c++程序转换为c语言
- javascript - 如何以这样的方式制作对象数组,使用户连续重复的对象形成一个新数组
- c# - 如何在 C# 和 System.Reactive 中将基于事件的类替换为基于可观察的类?
- python - Pandas:如何根据后续行添加具有值的列
- node.js - 使用 Electron 项目(和更好的 sqlite3)将未定义的 nodejs 处理为 bindings.js
- python - 空白屏幕pygame :(((
- mysql - 将多个 .sql 表转储文件合并到一个 SQL 文件中
- excel - 值为空