4

`我想知道如何更改此代码,以使两个向量的对应值不能相等。例如:如果 x = (1, 2, 2, 4, 8, 1, 7, 9, 5, 10) 并且 y = (3, 2, 7, 8, 4, 10, 4, 8, 2, 1),两个向量的第二个值等于 2。有什么办法可以告诉 R 在向量 x 的第二个点重新采样,直到它与向量 y 中的值不同?

x <- c(1:10)
y <- c(1:10)
sample_x <- sample(x, length(10), replace = TRUE)
z <- sample_x > y`
4

3 回答 3

7

你可以这样做:

while(any(x == y)) x <- sample(x)

编辑:现在我意识到x并且y可能来自类似的sample调用replace = TRUE,这是一种避免while循环的有趣方法。它使用索引和模来确保两个样本不匹配:

N <- 1:10  # vector to choose from (assumes distinct values)
L <- 20    # sample size - this might be length(N) as in your example

n <- length(N)

i <- sample(n,   L, replace = TRUE)
j <- sample(n-1, L, replace = TRUE)

x <- N[i]
y <- N[1 + (i + j - 1) %% n]
于 2013-08-05T01:11:20.567 回答
5
while (any(ind <- x==y))
   x[ind] <- sample(N, sum(ind), TRUE)

N您从哪里采样(或最大整数)

这里的好处是,如果您不需要重新采样所有x,那么这将更快地收敛。

于 2013-08-05T01:16:49.940 回答
0

您可以使用库组合中的函数 permn 来生成长度为 10 的向量的所有排列。

ind <- permn(10)
xy_any_equal <- sapply(ind, function(i) any(x[i] == y))
if(sum(xy_any_equal) < length(xy_any_equal)) x_perm <- x[head(ind[!xy_any_equal],1)[[1]]]
exists(x_perm)
于 2013-08-05T09:19:30.093 回答