比较矢量值

时间:2013-08-05 01:03:14

标签: r vector random-sample

`我想知道如何改变这个代码,以便两个向量的相应值不能相等。例如:如果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`

3 个答案:

答案 0 :(得分:7)

你可以这样做:

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

修改:现在我意识到xy可能来自与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)