【问题标题】:Create a new vector with no element being in the same position as the original vector?创建一个没有元素与原始向量位于相同位置的新向量?
【发布时间】:2018-10-02 10:22:45
【问题描述】:

假设我有一个向量V1(有两个或更多元素):

V1 <- 1:10

我可以使用函数sample 重新排序原始向量。但是,此函数无法确保新向量中的任何元素都与原始向量的位置相同。例如:

set.seed(4)
V2 <- sample(V1)

这将导致一个具有两个元素的向量与原始元素的位置相同:

V1[V1 == V2]

3 5

我的问题是:是否可以生成一个随机向量来确保两个向量之间没有元素位于同一位置?

【问题讨论】:

  • 您要求所有元素从其原始位置移动意味着您想要纯随机排序。

标签: r


【解决方案1】:

您要求向量中没有某些索引不能移动,这意味着您不想要可能发生这种情况的纯随机排列。我能想到的最好的办法就是循环,使用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

请注意,我已经实现了使用移位值移位位置的要求。这当然不是完全正确的,因为两个值可能相同。但是,假设您的所有条目都是唯一的,那么检查值的零重叠等于索引的零重叠。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多