2015-05-30 91 views
0

我想用兩個條件在rnorm上生成50個數字。 如果有號碼<99>101(即,在99-101之外),請忽略它們並再次運行rnorm,直到生成符合標準的50個總數。條件符合後終止while循環(R)

  1. 這與統計數據無關。我只是試圖學習如何使用while循環。
  2. 我懷疑rnorm(50,部分行3。,是計算效率低下 - 任何意見將是偉大的。

  3. 問題我有,雖然這個代碼的作品,它永遠持續下去。當有50個符合標準的觀測值時,它需要終止。 到目前爲止,我曾嘗試不成功使用ifbreak做到這一點...

到目前爲止的代碼:

1. z = rnorm(50, mean = 100, sd = 10) 
2. while(match(TRUE, z > 99) > 0 | match(TRUE, z < 101) > 0) { 
3. z = c(z[z >= 99 & z <= 101], rnorm(50, mean = 100, sd = 10)) 
4. } 
+0

你可以考慮一個隨機數生成有上限和下限。見這裏http://stackoverflow.com/questions/19343133/setting-upper-and-lower-limits-in-rnorm – SabDeM

+0

非常方便。謝謝。 – lnNoam

回答

1

你的循環「決不會退卻。」目前的形式的原因是因爲這些統計數據實際上是堆積在你身上的。

連續產生50個正態分佈數的均值±1標準差內的概率約爲4.22E-9。你的容忍度只有一個標準偏差的1/10 th,所以想象一下你的機率是多麼天文數字。

強制循環的迭代固定數量的最簡單方法是for循環:

for (i in 1:50) { 
    sum = sum + sum^0.5 
} 

否則,你可以添加一個看門狗計數器類似如下:

z = rnorm(50, mean = 100, sd = 10) 
wd = 0 
while(match(TRUE, z > 99) > 0 | match(TRUE, z < 101) > 0) { 
    z = c(z[z >= 99 & z <= 101], rnorm(50, mean = 100, sd = 10)) 
    wd = wd + 1 
    if (wd == 50) { break } 
} 

還要記住R中的循環相對較慢(與更典型的操作相比),除非有充分的理由,否則不鼓勵使用它們。 R是一種功能語言,大多數操作符和函數都是向量化的。你會發現矢量化的操作比等效的循環/程序流程快得多。

+0

謝謝我沒有試圖創建50個正態分佈的數字。相反,我只是想看看排除99-101以外的數字,直到我有50個數字。實際上,我之前已經瞭解了有關看門狗計數器(例如,在Python中)...爲什麼我在這裏沒有想到它對我來說是個謎。無論如何,再次感謝您的幫助! – lnNoam

+0

啊,我明白你在努力完成什麼。你當前的代碼不會工作,因爲'c()'命令正在執行一個向量級聯,它總是向'z'添加50個新的正常數字,所以'z'的長度始終在增長。 –

+0

是的,我修正了這個問題。再次感謝您的幫助。 – lnNoam

0

我想出了這個解決方案也是如此,這也將做到這一點:

rnorm_rg = function(x, mean, sd, lwr, upr){ 
    z = rnorm(x, mean = mean, sd = sd) 
    while (length(z[z >= lwr & z <= upr]) < x) { 
    z = c(z[z >= lwr & z <= upr], rnorm(x, mean = mean, sd = sd)) 
    z = z[z >= lwr & z <= upr] 
    } 
    print(z) 
} 

例如,

rnorm_rg( x = 50 
      , mean = 100 
      , sd = 10 
      , lwr = 99 
      , upr = 101 
)