为了账号安全,请及时绑定邮箱和手机立即绑定

data.table vs dplyr:一个人能做好事情,而另一个人做得不好吗?

data.table vs dplyr:一个人能做好事情,而另一个人做得不好吗?

弑天下 2019-07-13 16:20:05
概述我比较熟悉data.table,没那么多dplyr..我读过一些dplyr小插曲一些例子出现了,到目前为止,我的结论是:data.table和dplyr在速度上具有可比性,除非有许多(即>10-100 K)组,而且在其他一些情况下(见下面的基准)dplyr具有更易访问的语法dplyr抽象(或将)潜在的DB交互有一些细微的功能差异(参见下面的“示例/使用”)在我的心目中,2.没有多大的负担,因为我对它相当熟悉data.table虽然我理解对于这两个新用户来说,这将是一个很大的因素。我想避免争论哪个更直观,因为这与我从一个已经熟悉的人的角度提出的具体问题无关。data.table..我还想避免讨论“更直观”如何导致更快的分析(当然是正确的,但也不是我最感兴趣的)。问题我想知道的是:对于熟悉包的人来说,是否有更容易用一个或另一个包进行编码的分析任务(例如,所需击键的一些组合与所需级别的暗喻,其中每一个都较少是一件好事)。是否有分析任务在一个包中比另一个包中执行得更有效(即超过2倍)。一最近的问题让我更多地思考这件事,因为在那之前我没有想到dplyr会提供超出我所能做的data.table..这是dplyr解决方案(Q结束时的数据):dat %.%   group_by(name, job) %.%   filter(job != "Boss" | year == min(year)) %.%   mutate(cumu_job2 = cumsum(job2))比我的黑客攻击要好得多data.table解决办法。尽管如此,很好data.table解决方案也很好(谢谢Jean-Robert,Arun,注意,我喜欢单一的声明,而不是严格的最优解决方案):setDT(dat)[,   .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],    by=list(id, job)]后者的语法看起来非常深奥,但如果您习惯了,它实际上是非常简单的。data.table(即不使用一些更深奥的技巧)。理想情况下,我想看到的是一些好的例子dplyr或data.table方法实质上更简洁,或者表现得更好。实例使用dplyr不允许返回任意行数的分组操作(从埃德迪问题,注意:看起来它将在Dplyr 0.5同时,@初学者展示了一种潜在的解决办法-使用do在回答@Eddi的问题时)。data.table支座滚动连接(谢谢@dholstius)重叠联接data.table内部优化窗体的表达式。DT[col == value]或DT[col %in% values]为速度贯通自动标引用二进制搜索同时使用相同的基R语法。看这里更多的细节和一个小小的基准。dplyr提供功能的标准评估版本(例如:regroup, summarize_each_),这可以简化dplyr(注:按方案使用data.table是绝对有可能的,只是需要一些仔细的思考,替换/引用,等等,至少据我所知)基准我跑了我自己的基准并发现这两个包在“拆分应用合并”风格分析中是可比较的,除非在有大量组(>100 K)的情况下。data.table变得更快。@Arun联接基准,表明data.table比例尺dplyr随着组数的增加(在包和最近版本的R中都更新了最近的增强)。同时,在尝试获取唯一价值有data.table~6倍快。(未经核实)data.table在更大版本的组/应用/排序时,速度提高了75%dplyr比小的快40%从评论中提出的另一个这样的问题,谢谢丹纳斯)。马特,主要作者data.table,有的基准分组操作data.table, dplyr巨蟒pandas最多20亿行(内存中~100 GB).阿80K组的旧基准有data.table~8倍快
查看完整描述

目前暂无任何回答

  • 0 回答
  • 0 关注
  • 638 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信