我为提出一个简单的问题而道歉,但我想第一次学习如何在R中使用for-loops而且没有太多的运气概括了任何指南告诉我的具体问题(或者一般来说!)我需要从专家意见中做出很多(~18)不同的分布,并且可以通过将三角形分布一起添加来实现。但是,代码并不是很好,我认为可以使用for循环进行改进,但我不确定如何 - 特别是因为所有的min / max / mode估计都不同。我怎么能改善这个? (以下代码仅适用于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 :(得分:4)
重复@Luca的回答,我会使用apply和rowSums:
rowSums( apply(values, 1, function(args) dtriang(x, min=args[1],
max=args[2],
mode=args[3])
))
答案 1 :(得分: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)))
})
答案 2 :(得分: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