代码之家  ›  专栏  ›  技术社区  ›  Likan Zhan

创建一个新的向量,其中没有元素与原始向量处于同一位置?

r
  •  3
  • Likan Zhan  · 技术社区  · 6 年前

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

    V1 <- 1:10
    

    我可以用函数对原始向量重新排序 sample

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

    V1[V1 == V2]
    
    3 5
    

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   Tim Biegeleisen    6 年前

    你的要求是在向量中没有特定的索引,不能移动,这意味着你不希望出现一个纯粹的随机排列。我能想到的最好办法就是用 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

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