2013-08-05 52 views
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` 
+0

'长度(10)''是1',一些奇怪的与您的代码。 'sample_x> y'也没什么意义。 – flodel

+0

OP代码中的'sample_x'大小为1,因此'sample_x> y'将会检查'sample_x'对'y'中的每个值。 (我确定不是什么意图,但会运行得很好) –

+0

我在想长度(10)会创建一个长度为10的矢量,但我猜不是。我试图从x中取样10次,同时更换值。因此,根据sample_x中的值是否大于向量y中的相应值,z会给予TRUE或FALSE。 –

回答

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] 
+0

很聪明! +1 –

5
while (any(ind <- x==y)) 
    x[ind] <- sample(N, sum(ind), TRUE) 

其中N是你从取样什么(或最大整数)

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

0

您可以使用功能permn从库combinat产生长度的矢量的所有排列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) 
+1

认真吗?你会建议在这两个解决方案已发布? – flodel

+0

当矢量长度超过7时,我不会推荐它。 –