【问题标题】:R: strange result using sample function in applyR:在应用中使用示例函数的奇怪结果
【发布时间】:2012-06-28 23:19:52
【问题描述】:

我正在运行一个模拟,该模拟从 1 列开始的矩阵中获取值样本。然后我将它们通过选择标准,然后从矩阵中的每一行中随机选择输出中的一个值并保存该随机选择。出于某种原因,当我将sample 应用于具有实数和NA 的行上的矩阵时,它会返回一个甚至无法采样的数字。我可能对 sample 函数做错了,但我不明白这个未知值的来源。

示例代码:

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

我不想包含任何 0 值,因此我将它们更改为 NA,然后将 sample 函数应用于每一行以返回单个值。

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 是我所知道的无处可寻的。

有谁知道我在取样时犯了什么错误?

【问题讨论】:

  • 我想你只是想避免在只有 1 个项目时使用 sample。这似乎给出了你所追求的:matrix(apply(xn, 1, function(x){if (length(x[!is.na(x)]) &gt; 1) { sample(x[!is.na(x)], size = k) } else x[!is.na(x)] }), ncol=k)
  • 文档中明确说明了这种行为; ?sample:“如果 x 的长度为 1,是数字(在 is.numeric 的意义上)并且 x >= 1,则通过 sample 进行采样从 1:x 开始。”
  • 谢谢,我只是查看了示例并做了:set.seed(1) &gt; sample(102, 1) [1] 28 查看示例文档,它说:'如果 x 的长度为 1,是数字(在 is.numeric 的意义上)和 x > = 1,通过 sample 进行采样从 1:x'
  • @GSee,你的代码很好用。

标签: r simulation sample apply


【解决方案1】:

总结一下cmets,

?sample

如果 x 的长度为 1,是数字(在 is.numeric 的意义上)并且 x >= 1,则通过 sample 进行采样从 1:x 开始。

对于您的应用程序,当 x 的长度为 1 时,您真的只想使用 x 的值而不是 sample(x)。您可以通过添加检查来调整您的代码,以查看 x 的长度是否大于 1,然后再将其传递给 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

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2020-10-22
    • 2017-05-14
    相关资源
    最近更新 更多