【问题标题】:How to efficiently iterate through a complicated function that outputs a dataframe?如何有效地迭代输出数据帧的复杂函数?
【发布时间】:2015-10-26 21:08:52
【问题描述】:

我基本上需要遍历参数A,B,C 的一组值,以生成一个结果表,这将帮助我分析这些参数的重要性。这是用于 R 中的程序。

让我们这么说:

  1. A 来自 rangeA = 1:10
  2. B 来自 rangeB = 11:20
  3. 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 &lt;- rbind(res, tmp) 没有提供键值对,这意味着按照目前的结构从 res 获取 a、b、c 的“最佳”值似乎是不必要的痛苦。
  • 另外,为 res 预分配内存并使用 res[k] &lt;- 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


【解决方案1】:

不确定上面是什么语言,所以不确定这有多相关,但这里有:您是在输出/发送数据时还是在内存中收集所有显示结果,然后一次性全部输出结尾?当我遇到大型数据集的类似问题时,这种方法帮助了我几次。例如,将 10,000 个数据点发送回客户端以获得图形,而不是生成所有这些点的数组并发送它,而是在每个点之后输出到屏幕,然后释放内存。这仍然需要一段时间,但这是不可避免的。重要的是它不会崩溃。

【讨论】:

  • 我使用的语言是 R。我似乎没有遇到崩溃问题。这更多的是性能问题。我真的不需要绘制数据,我只需要将数据存储在一个变量中,以便以后可以访问它以进行进一步的计算/操作
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2022-11-10
  • 2020-09-02
  • 2021-11-29
  • 1970-01-01
  • 2018-11-04
  • 2014-09-16
相关资源
最近更新 更多