2014-04-03 84 views
1

我很抱歉提出一個簡單的問題,但我第一次嘗試學習如何在R中使用for-loops,並且沒有很多運氣來概括任何指南向我指出的具體問題(或者一般情況下!)我需要從專家意見中做出很多(〜18)不同的分佈,並且可以通過將三角形分佈添加到一起來做到這一點。然而,代碼不是很好,我認爲它可以改進使用for循環,但我不知道如何 - 尤其是因爲所有的最小/最大/模式估計是不同的。我怎麼能改善這個? (下面的代碼只是18或分佈):我如何讓這段代碼更加緊湊/高效?

library(mc2d) 
x <- seq(from=0.5, to=6, by=0.001) 
june.cool <- dtriang(x, min=1, max=2, mode=1) + 
      dtriang(x, min=1, max=4, mode=2) + 
      dtriang(x, min=0.5, max=1, mode=1) + 
      dtriang(x, min=2, max=4, mode=3) + 
      dtriang(x, min=0.25,max=1, mode=1) + 
      dtriang(x, min=1, max=3, mode=2) + 
      dtriang(x, min=0.5, max=2, mode=1) + 
      dtriang(x, min=1, max=5, mode=2.5) + 
      dtriang(x, min=1, max=6, mode=4) 
+0

什麼是'dpert'? – Hugh

+0

@Hugh - 我在猜測這個包中的一個函數:http://www.inside-r.org/packages/cran/mc2d/docs/qpert – thelatemail

+0

你應該添加所有的包依賴。 – CCurtis

回答

1

你可以嘗試這樣的事情(僅前三發行完成)

values <- data.frame(min = c(1,1,0.5), 
        max = c(2,4,1), 
        mode = c(1,2,1)) 

june.cool <- eval(parse(text=paste(apply(values, 1, function(my.row) 
       sprintf("dtriang(x, min=%f, max=%f, mode=%f) ", 
        my.row["min"], my.row["max"], my.row["mode"])), 
      collapse = " + ") 
)) 

從指定的分佈參數的data.frame開始,創造單報表和paste荷蘭國際集團一起表達,然後對其進行評估,並將其分配給june.cool

+0

這只是我一直在尋找的東西!有很多命令在這裏我不認識,所以我會很高興看他們:)我希望我能弄清楚如何做到這一點我自己,但我想它帶有更多的R經驗。謝謝盧卡 – HFBrowning

+0

我不知道地圖,但我認爲@尼爾的方式肯定比我的更好! (是的,我喜歡智力誠實:))一些其他時間(例如內循環),我發現有用的'eval(解析(文本=富))'技巧 –

4

Riffing上@盧卡的答案,我會使用申請,並rowSums:

rowSums( apply(values, 1, function(args) dtriang(x, min=args[1], 
               max=args[2], 
               mode=args[3]) 
             )) 
2

通常更好的方法是使用該語言,而不是將字符串粘貼在一起並進行評估。該專家說:

xprt <- data.frame(min=c(1, 1, .5, 2, .25, 1, .5, 1, 1), 
        max=c(2, 4, 1, 4, 1,3, 2, 5, 6), 
        mode=c(1, 2, 1, 3, 1, 2, 1, 2.5, 4)) 

你想Map,使用dtriang,每行一個新的值,用一個額外的參數(跨行常數)x,所以

val <- with(xprt, Map(dtriang, min=min, max=max, mode=mode, MoreArgs=list(x=x))) 

這給出了一個結果列表,並且希望通過總結起來

Reduce(`+`, val) 

結合,以減少他們對單個值:

with(xprt, { 
    Reduce(`+`, Map(dtriang, min=min, max=max, mode=mode, MoreArgs=list(x=x))) 
}) 
+0

嗨馬丁 - 你說與語言工作 - 你是什麼是什麼意思? – HFBrowning

+0

您選擇的答案會創建一個_character string_表示要評估的表達式,然後對其進行評估。相比之下,@NealFultz的回答和我的回答直接與_symbols_相關,後者引用了您希望轉換的值。 –