概述
我比较熟悉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
是绝对有可能的,只是需要一些仔细的思考,替换/引用,等等,至少据我所知)
基准