【问题标题】:vectorization in functions with some tables as parameters以某些表为参数的函数中的向量化
【发布时间】:2019-03-12 14:41:28
【问题描述】:

我需要一些关于最佳实践的帮助

我有一个函数 fc_mean_wages() 计算一个值(平均工资)并执行这些任务(粗略地):

  1. 获取工人的月工资作为参数(长度 m 或更短)
  2. 如果我没有m工资,我会寻找获得类似替代的方法: 2a.从同一雇主处获得其他工人的中位数, 2b。否则,我会得到该活动的全国平均值
  3. 获取 m 指数表,以根据通货膨胀调整工资。
  4. 我计算 m 个选定值的加权平均值

我必须与成千上万的工人一起完成这项任务。所以我可以做两件事

  1. A.将完整的工资数据库作为参数,使用 ONE 函数调用计算所有数据。
  2. 乙。仅将一名工人的工资作为参数,以矢量化方式计算所有工资(例如:wages %>% group_by (worker) %>% mutate(., index_tables, wages, activity_means_table)

我选择 A 是因为该函数需要计算同一工资数据库的中位数,并且当您必须将大表作为输入时,不知道向量化是否能正常工作。 我的 A 解决方案不是一个很好的函数,它更像是一个单一的过程而不是一个函数形式。

¿可以尝试矢量化此任务吗? ¿ 是否有更好的绩效调用工资表多次并按工人过滤工人?

【问题讨论】:

  • 说明你正在使用什么包,出现tidyverse,还有其他的吗?
  • 我正在使用tidyverse 家族和lubridate

标签: r function tidyverse


【解决方案1】:

显然对于函数来说这是一项非常复杂的任务。

我建议你把它分成更简单的部分。

即使如此,您也无法避免阅读整个表格来执行您提到的查找(在雇主的工资单中查找媒体)。解决方案是分析这些任务中哪些是易变的,哪些不是。

例如,雇主的工资单可能每月更改一次。然后只运行一次查找过程;它不一定是一个函数。 可能需要根据需要过滤所选工人的薪水等其他功能,因此请对其进行功能化。

最后,使用profvismicrobenchmark 包记录改进并记录复杂的过程。将一次性运行进程从核心中分离出来;以后可以用另一种语言代替,可以委托给 IT 团队,或者由于改进数据库设计或因为数据质量更好而过时。

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2014-09-03
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多