我比较熟悉data.table,而不是那么熟悉dplyr.我已经阅读了一些出现在SO上的dplyr小插曲和例子,到目前为止我的结论是:
data.table并且dplyr在速度上具有可比性,除非有许多(即> 10-100K)组,并且在某些其他情况下(参见下面的基准)dplyr 有更多可访问的语法dplyr 摘要(或将)潜在的DB交互在我看来2.没有多大的重量,因为我对它很熟悉data.table,虽然我明白对于那些对这两者都不熟悉的用户来说这将是一个很重要的因素.我想避免争论哪个更直观,因为这与我从已经熟悉的人的角度提出的具体问题无关data.table.我还想避免讨论"更直观"如何导致更快的分析(当然是真的,但同样,不是我最感兴趣的).
我想知道的是:
最近的一个问题让我更多地思考这个问题,因为直到那时我才认为dplyr会提供超出我已经做过的东西data.table.这是dplyr解决方案(Q末尾的数据):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
Run Code Online (Sandbox Code Playgroud)
这比我的黑客尝试data.table解决方案要好得多.也就是说,好的data.table解决方案也相当不错(感谢Jean-Robert,Arun,并注意到这里我赞成对最严格的最佳解决方案的单一陈述):
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
Run Code Online (Sandbox Code Playgroud)
后者的语法可能看起来非常深奥,但如果你习惯了data.table(即不使用一些更深奥的技巧),它实际上非常简单.
理想情况下,我希望看到的是一些很好的例子,dplyr …
我创建了一个简单的数据框(dput如下):
date ticker value
------------------------------
2016-06-30 A2M.ASX 0.0686
2016-07-29 A2M.ASX -0.0134
2016-08-31 A2M.ASX -0.0650
2016-09-30 A2M.ASX 0.0145
2016-10-31 A2M.ASX 0.3600
2016-11-30 A2M.ASX -0.1429
Run Code Online (Sandbox Code Playgroud)
我想将value列的名称更改为我的metric变量名称中的任何内容,我想以某种dplyr方式执行此操作.
我的样本数据:
df = structure(list(date = c("2016-06-30", "2016-07-29", "2016-08-31", "2016-09-30", "2016-10-31", "2016-11-30"), ticker = c("A2M.ASX", "A2M.ASX", "A2M.ASX", "A2M.ASX", "A2M.ASX", "A2M.ASX"), value = c(0.0686, -0.0134, -0.065, 0.0145, 0.36, -0.1429)), .Names = c("date", "ticker", "value"), row.names = c(NA, 6L), class = "data.frame")
metric = "next_return"
Run Code Online (Sandbox Code Playgroud)
我知道如何在一行中做到这一点:
colnames(df)[3] = metric
Run Code Online (Sandbox Code Playgroud)
但我想以某种tidyverse …