概述
我对data.table
比较熟悉,对dplyr
不太熟悉.我已经阅读了大约dplyr
vignettes个例子,到目前为止,我的结论是:
-
data.table
anddplyr
are comparable in speed, except when there are many (i.e. >10-100K) groups, and in some other circumstances (see benchmarks below) -
dplyr
有更容易理解的语法 -
dplyr
篇摘要(或将)潜在的数据库交互 - 存在一些小的功能差异(请参见下面的"示例/用法")
在我心目中2.没有太大的影响力,因为我对它非常熟悉,尽管我知道对于两个领域的新手来说,这将是一个很大的因素.我想避免关于哪个更直观的争论,因为这与我从熟悉data.table
的人的Angular 提出的具体问题无关.我还想避免讨论"更直观"如何导致更快的分析(当然是真的,但再一次,这不是我最感兴趣的).
问题
我想知道的是:
- 对于熟悉软件包的人来说,使用一个或另一个软件包编写分析任务是否容易得多(例如,所需的击键与所需的深奥程度的某种组合,其中每种击键次数越少越好).
- 是否存在在一个包中比在另一个包中更有效地执行分析任务(即超过2倍)的情况.
一个recent SO question让我更加思考这个问题,因为在那之前,我不认为dplyr
能提供比我在data.table
中已经能做的更多的东西.以下是dplyr
解决方案(数据在Q末尾):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
这比我try 破解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
的方式更简洁或性能更好.
例子
Usage-
dplyr
不允许返回任意行数的分组操作(从100开始,注意:这看起来将在101中实现,@初学者在回答@eddi的问题时使用do
也显示了一个潜在的解决方案). -
data.table
支持100(感谢@dholstius)和101 -
data.table
对speed到automatic indexing的DT[col == value]
或DT[col %in% values]
形式的表达式进行内部优化,该表达式使用binary search,同时使用相同的基本R语法.See here了解更多细节和一个小基准. -
dplyr
提供了标准的函数判断版本(例如regroup
、summarize_each_
),可以简化dplyr
的编程使用(注:data.table
的编程使用绝对是可能的,只需要仔细考虑、替换/引用等,至少据我所知)
- I ran my own benchmarks and found both packages to be comparable in "split apply combine" style analysis, except when there are very large numbers of groups (>100K) at which point
data.table
becomes substantially faster. - @Arun运行了大约100个,显示随着组数的增加,
data.table
个组的伸缩性优于dplyr
个组(更新了最近两个包中的增强功能和最新版本的R).此外,当一个基准测试试图获得101分时,速度会快data.table
~6倍. - (未经验证)在较大版本的组/应用/排序上的速度快
data.table
75%,而在较小版本上的速度快dplyr
40%(感谢danas,100). - 《
data.table
》的主要作者马特有benchmarked grouping operations ondata.table
,dplyr
and pythonpandas
on up to 2 billion rows (~100GB in RAM)本书. -
100的速度提高了
data.table
~8倍
数据
这是我在问题部分展示的第一个例子.
dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob",
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L,
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L,
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager",
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager",
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id",
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA,
-16L))