【问题标题】:random number inside for loopfor循环内的随机数
【发布时间】:2012-05-20 23:35:19
【问题描述】:

这已经让我发疯了,现在我完全绝望了:(

这是矩阵draw(不要关注NA,稍后我需要那些列):

      [,1] [,2] [,3] [,4] [,5]  
[1,]    1    0   NA   NA   NA  
[2,]    2   20   NA   NA   NA  
[3,]    2   30   NA   NA   NA  
[4,]    2   40   NA   NA   NA  
[5,]    1   50   NA   NA   NA  
[6,]    2   70   NA   NA   NA  
[7,]    2   80   NA   NA   NA  
[8,]    2   90   NA   NA   NA  
[9,]    1  100   NA   NA   NA
[10,]   2  120   NA   NA   NA
[11,]   2  130   NA   NA   NA
[12,]   2  140   NA   NA   NA

所以,根据第 1 列,我需要根据正态分布在第 3 列中写入数字。但在 6% 的情况下,它必须为 0。

这就是我想的处理方式(现在只有draw[i,1]==2时):

for (i in 1:nrow(draw))
{
    p <- runif(1, min=0, max=1)
    if (draw[i,2]==2 && p>0.06) 
    {   
        draw[i,3] <- rnorm(1, mean=17, sd=7.5)} else {draw[i,3]<-0}

    if (draw[i,1]==1) {draw[i,3] <- rnorm(1, mean=11, sd=3)}
    if (draw[i,1]==3) {draw[i,3] <- rnorm(1, mean=17, sd=15)}
    if (draw[i,3]<1 && draw[i,3]!=0) {draw[i,3] <- 1} else {draw[i,3] <- ceiling(draw[i,3])
}
}

问题来了: 1. 我注意到 p(我猜它必须是随机数)总是相同的 2.所有draw[i,3]其中draw[1,2]==2都是0。这很奇怪,因为即使p>0.06也会发生:

      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    0   19   NA   NA
 [2,]    2   20    0   NA   NA
 [3,]    2   30    0   NA   NA
 [4,]    2   40    0   NA   NA
 [5,]    1   50   11   NA   NA
 [6,]    2   70    0   NA   NA
 [7,]    2   80    0   NA   NA
 [8,]    2   90    0   NA   NA
 [9,]    1  100    7   NA   NA
[10,]    2  120    0   NA   NA
[11,]    2  130    0   NA   NA
[12,]    2  140    0   NA   NA

为什么?!怎么了?

【问题讨论】:

  • 您是希望所有的if语句都按此顺序执行还是只需要执行一条if语句?
  • 你是否意识到你的pdraw[i,1]==3 or 1时不起作用
  • 不应该if (draw[i,2]==2 &amp;&amp; p&gt;0.06) if (draw[i,1]==2 &amp;&amp; p&gt;0.06
  • 天哪!谢谢谢谢,连续2天的医生编程实在是太多了! :)

标签: r random for-loop


【解决方案1】:

嗯。你说当draw[i,1]==2你想做某事,但是在你的代码中你写draw[i,2]==2...这可能就是问题所在!

# This line might work better:
if (draw[i,1]==2 && p>0.06) 

...但无论如何,它似乎相当混乱。也许这就是你的意思? - 除非我放在那里的任何错误:)

for (i in 1:nrow(draw)) {
  p <- runif(1, min=0, max=1)

  draw[i,3] <- if (p <= 0.06) 0
    else switch(draw[i,1], 
      rnorm(1, mean=11, sd=3),   # 1
      rnorm(1, mean=17, sd=7.5), # 2
      rnorm(1, mean=17, sd=15)   # 3
    )

  draw[i,3] <- if (draw[i,3]<1 && draw[i,3]!=0) 1 else ceiling(draw[i,3])
}

【讨论】:

  • 是的,这就是问题所在……抱歉打扰了这么愚蠢的案例:)
猜你喜欢
  • 2018-03-30
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2020-08-05
  • 2018-01-20
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多