`我想知道如何改变这个代码,以便两个向量的相应值不能相等。例如:如果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`
答案 0 :(得分: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]
答案 1 :(得分:5)
while (any(ind <- x==y))
x[ind] <- sample(N, sum(ind), TRUE)
其中N
是您从中采样的(或最大整数)
这里的优点是,如果您不需要重新采样所有x
,那么这将更快地收敛。
答案 2 :(得分: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)