2013-06-24 27 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(不确定它是否合理)。