【发布时间】:2015-10-26 21:08:52
【问题描述】:
我基本上需要遍历参数A,B,C 的一组值,以生成一个结果表,这将帮助我分析这些参数的重要性。这是用于 R 中的程序。
让我们这么说:
-
A来自rangeA = 1:10 -
B来自rangeB = 11:20 -
C来自rangeC = 21:30
我目前使用的最简单(不是最有效)的解决方案是这样的:
### here I create this empty dataframe because I add on each tmp calc later
res <- data.frame()
### here i just create a random dataframe for replicative purposes
dataset <- data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))
ParameterAdjustment() <- function{
for(a in rangeA){
for(b in rangeB){
for(c in rangeC){
### this is a complicated calculation that is much more
### difficult than the replicable example below
tmp <- CalculateSomething(dataset,a,b,c)
### an example calculation
### EDIT NEW EXAMPLE CALCULATION
tmp <- colMeans(dataset+a*b*c)
tmp <- data.frame(data.frame(t(tmp),sd(tmp))
res <- rbind(res,tmp)
}
}
}
return(res)
}
我的问题是,这适用于在 7000x500 数据帧上运行计算的原始数据集。但是,我的新数据集要大得多,性能已成为一个重要问题。任何人都可以建议或帮助更有效的解决方案吗?谢谢。
【问题讨论】:
-
我认为您需要提供一个更真实的
CalculateSomething示例。这目前相当简单,因为tmp是一个标量。虽然,TBH,您的res <- rbind(res, tmp)没有提供键值对,这意味着按照目前的结构从res获取 a、b、c 的“最佳”值似乎是不必要的痛苦。 -
另外,为 res 预分配内存并使用
res[k] <- tmp而不是大量调用 assignment 和 rbind 会很有用 -
我已经编辑了示例计算以使其更合适
-
还有
sd(colMeans(dataset + a*b*c)) == sd(colMeans(dataset) + a*b*c) == sd(colMeans(dataset)),因为 sd(X + abc) = sd(X) + 0 其中 X 是 RV,a,b,c 是常数跨度> -
我知道 mean 和 sd 的那些属性是存在的。我只是用一个简单的计算来说明我的观点。我的函数不使用具有此类属性的计算。它实际上是计算投资组合绩效统计数据,因此必须以与编辑问题类似的方式将值保存在数据框中
标签: r performance for-loop vectorization