2012-06-28 29 views
0

我正在运行一个模拟,它以1列开始的矩阵取值。然后我通过选择标准,然后从矩阵的每一行中,它随机从输出中选择一个值,并保存随机选择。由于某些原因,当我将sample()应用于具有实数和NA的行上的矩阵时,它会返回一个甚至无法采样的数字。我可能做了一些错误的sample()函数,但我不明白这个未知值来自哪里。R:在应用中使用示例函数的奇怪结果

示例代码:

theta <- c(30, 84, 159, 32, 60, 97) 
omega <- 0.01 
k <- 1 
xn <- matrix(c(30, 84, 159, 32, 60, 97), ncol=1) 

dup <- xn * 2 

set.seed(1) 
z <- matrix(rbinom(n=rep(1,length(dup)),size = as.vector(dup),prob = 0.5),nrow = nrow(dup))    
z1 <- dup - z   
xn <- cbind(z, z1) # put both in a matrix 
W <- exp(-(1/2)*(((xn - theta)/theta) ^2/omega))   

set.seed(1) 
Z <- matrix(rbinom(nrow(W) * ncol(W), 1, W), nrow=nrow(W), ncol=ncol(W)) 
xn <- ifelse (Z == 0, 0, xn) 

xn 
    [,1] [,2] 
[1,] 32 0 
[2,] 78 0 
[3,] 144 0 
[4,] 0 30 
[5,] 60 60 
[6,] 92 102 

我不想让我将其更改为NA,然后应用样品()函数到每个行到返回一个值以包括任何0值。

xn[which(xn==0)] <- NA 
set.seed(1) 
xn2 <- matrix(apply(xn, 1, function(x){sample(x[!is.na(x)], size = k)}), ncol = k) 

我应该得到的是

xn 
    [,1] 
[1,] 32 
[2,] 78 
[3,] 144 
[4,] 30 
[5,] 60 
[6,] 102 

但我得到的是:

xn 
    [,1] 
[1,] 9 
[2,] 30 
[3,] 83 
[4,] 24 
[5,] 60 
[6,] 102 

具体而言,在这个例子中,值9,23,55,和24来我知道的无处不在。

有没有人知道当我拿这个样本时我犯了什么错误?

+0

哎呀之前大于1,增加他们在那里 – Kevin

+1

我觉得你只是想避免使用'sample'时只有1件物品。这似乎给了你后面的内容:矩阵(应用(xn,1,function(x){if(length(x [!is.na(x)])> 1){sample(x [!is。 na(x)],size = k)} else x [!is.na(x)]}),ncol = k)' – GSee

+0

这种行为在文档中有明确说明; '?sample':“如果x的长度为1,是数字(在is.numeric的意义上)且x> = 1,则通过样本的采样从1:x开始。 –

回答

2

总结注释,

?sample

如果x具有长度1,是数字(在is.numeric的意义上),并通过样本x> = 1,从取样发生1:X。

为您的应用,当x的长度为1的,你真的只是想用的x代替sample(x)值。您可以通过添加校验适应你的代码,看是否x长度将其通过sample

matrix(apply(xn, 1, function(x){ 
    if (length(x[!is.na(x)]) > 1) { 
    sample(x[!is.na(x)], size = k) 
    } else x[!is.na(x)] 
}), ncol=k) 
    [,1] 
[1,] 32 
[2,] 78 
[3,] 144 
[4,] 30 
[5,] 60 
[6,] 102