2013-08-05 128 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時,我不會推薦它。 –