2013-06-24 48 views
0

我有兩個不同長度的向量X和Y.假設如何在R中概率合併兩個向量

X = c('a','b','c','d','e') 
Y = c('x','y','z') 

我有將值0和1。我想以概率方式這兩個向量合併之間設定的參數的α。這是一個函數,該函數從時間的向量X alpha的百分比中抽出,並從Y的剩餘時間抽出。例如,如果字母被設定爲0.9,然後將所得矢量R,可以是

R = a,x,b,c,d,y,e,z 

通知該矢量的前部具有從X其它更多的元件,因爲alpha是高的。 R有沒有一種快速的方法?我用Perl中的數組和隊列來做這件事,我發現它很麻煩。另外,我不需要關心下次它運行的順序是否不同,因爲它本身具有概率性。

我需要保留每個向量中的順序X & Y. 請注意,a,b,c,d ...和x,y,z按順序排列。

+1

這是採樣* *不更換?當X向量爲空時會發生什麼?請澄清。 – krlmlr

+0

這是沒有更換的取樣。當向量X爲空時,只返回Y(保存順序)。如果Y爲空,則返回X(保存順序) – broccoli

回答

1

保留向量的順序輸出,建設關@ dickoa的嘗試:

x <- c('a','b','c','d','e') 
y <- c('x','y','z') 

prop_x <- 0.9 
prop_y <- 1 - prop_x 

r <- sample(c(x, y), prob = c(rep(prop_x, length(x)), rep(prop_y, length(y)))) 

# find indices that are x and substitute x in (guaranteed to be in order) 
r[r %in% x] <- x 
r[r %in% y] <- y 

[1] "a" "x" "y" "b" "c" "d" "e" "z" 
+0

這很好。非常感謝。 – broccoli

+0

@broccoli,是否存在'Y'中的元素? – Arun

+0

小心!概率是不正確的。根據OP規範,'prop_x'需要是'0.9/length(x)','prop_y'也必須被調整。 (這是在使用*更換的情況下進行採樣*顯然,問題是關於採樣*沒有*替換 - 在這種情況下,問題似乎被錯誤指定......) – krlmlr

3

您可以使用sample

X = c('a','b','c','d','e') 
Y = c('x','y','z') 

set.seed(123) 
R <- sample(c(X, Y), prob = c(rep(0.9, length(X)), rep(0.1, length(Y)))) 
R 
[1] "d" "c" "b" "y" "x" "a" "e" "z" 

要獲得相同的順序:

set.seed(123) 
Z <- c(X,Y) 
R <- sample(seq_along(Z), prob=c(rep(0.9, length(X)), rep(0.1, length(Y)))) 
out <- integer(length(Z)) 
out[R <= length(X)] <- X 
out[R > length(X)] <- Y 

這會照顧的事情,即使有一些之間的共同元素XY(不確定它是否合理)。