假设我有一个向量 V1
(具有两个或更多元素):
V1 <- 1:10
我可以使用函数
sample
重新排序原始向量.但是,此函数无法确保新向量中的任何元素都不会与原始向量位于同一位置。例如:set.seed(4)
V2 <- sample(V1)
这将导致具有两个元素与原始元素位于相同位置的向量:
V1[V1 == V2]
3 5
我的问题是:是否可以生成一个随机向量以确保两个向量之间没有元素位于同一位置?
最佳答案
您要求向量中没有某些索引无法移动意味着您不想要可能发生的纯随机排列。我能想到的最好的方法就是循环,使用 sample
直到我们找到一个向量,其中每个元素都发生了变化:
v1 <- 1:10
v1_perm <- v1
cnt <- 0
while (sum(v1 == v1_perm) > 0) {
v1_perm <- sample(v1)
cnt <- cnt + 1
}
v1
v1_perm
paste0("It took ", cnt, " tries to find a suitable vector")
[1] 1 2 3 4 5 6 7 8 9 10
[1] 3 10 4 7 8 1 6 2 5 9
[1] "It took 3 tries to find a suitable vector"
Demo
请注意,我已经实现了使用移位值移位位置的要求。这当然不是严格正确的,因为两个值可能相同。但是,假设您的所有条目都是唯一的,那么检查值的零重叠就等于索引的零重叠。
关于r - 创建一个没有元素与原始向量位于相同位置的新向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52606467/