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

概述

我比较熟悉data.table,没那么多dplyr..我读过一些dplyr小插曲一些例子出现了,到目前为止,我的结论是:

  1. data.table

    dplyr

    在速度上具有可比性,除非有许多(即>10-100 K)组,而且在其他一些情况下(见下面的基准)
  2. dplyr

    具有更易访问的语法
  3. dplyr

    抽象(或将)潜在的DB交互
  4. 有一些细微的功能差异(参见下面的“示例/使用”)

在我的心目中,2.没有多大的负担,因为我对它相当熟悉data.table虽然我理解对于这两个新用户来说,这将是一个很大的因素。我想避免争论哪个更直观,因为这与我从一个已经熟悉的人的角度提出的具体问题无关。data.table..我还想避免讨论“更直观”如何导致更快的分析(当然是正确的,但也不是我最感兴趣的)。

问题

我想知道的是:

  1. 对于熟悉包的人来说,是否有更容易用一个或另一个包进行编码的分析任务(例如,所需击键的一些组合与所需级别的暗喻,其中每一个都较少是一件好事)。
  2. 是否有分析任务在一个包中比另一个包中执行得更有效(即超过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(即不使用一些更深奥的技巧)。

理想情况下,我想看到的是一些好的例子dplyrdata.table方法实质上更简洁,或者表现得更好。

实例

使用

  • dplyr

    不允许返回任意行数的分组操作(从

    埃德迪问题

    ,注意:看起来它将在

    Dplyr 0.5

    同时,@初学者展示了一种潜在的解决办法-使用

    do

    在回答@Eddi的问题时)。
  • data.table

    支座

    滚动连接

    (谢谢@dholstius)

    重叠联接

  • data.table

    内部优化窗体的表达式。

    DT[col == value]

    DT[col %in% values]

    速度

    贯通

    自动标引

    二进制搜索

    同时使用相同的基R语法。

    看这里

    更多的细节和一个小小的基准。
  • dplyr

    提供功能的标准评估版本(例如:

    regroupsummarize_each_

    ),这可以简化

    dplyr

    (注:按方案使用

    data.table

    是绝对有可能的,只是需要一些仔细的思考,替换/引用,等等,至少据我所知)

基准

弑天下
浏览 638回答 0
0回答
打开App,查看更多内容
随时随地看视频慕课网APP