我有如下数据集,我想计算每个唯一 id 的平均时间差
data:
membership_id created_date
1 12000000 2015-01-20
2 12000001 2012-11-19
3 12000001 2013-10-07
4 12000001 2014-03-06
5 12000001 2015-01-14
6 12000003 2013-02-08
7 12000003 2014-03-06
8 12000000 2014-02-05
9 12000000 2012-01-06
Run Code Online (Sandbox Code Playgroud)
从上面的数据集中,我想计算每个唯一 ID 的日期之间的平均时间差
尝试过:
library(plyr)
data =data[order(data$membership_id,data$created_date),]
result = ddply(data,.(membership_id),summarize, avg = as.numeric(mean(diff(created_date))))
Run Code Online (Sandbox Code Playgroud)
当我应用小数据时,上面的代码工作正常,但我的数据集有 500 万行,并且花费了大量时间,而且仍然从过去 6 小时开始运行
预期输出:
membership_id avg_time_diff
1 12000000 76 days
2 12000001 56 days
3 12000003 54 days
Run Code Online (Sandbox Code Playgroud)
来自plyr,您可能可以很容易地过渡到dplyr。它不会像数据表那么快,但会比.ddply
dat %>% group_by(membership_id) %>%
arrange(created_date) %>%
summarize(avg = as.numeric(mean(diff(created_date))))
# Source: local data frame [3 x 2]
#
# membership_id avg
# (int) (dbl)
# 1 12000000 555
# 2 12000001 262
# 3 12000003 391
Run Code Online (Sandbox Code Playgroud)
无需任何更多的实际努力,您可以通过转换为对象来加快速度data.table,但仍然使用dplyr命令。Puredata.table仍然会更快。
(使用此数据)
dat = structure(list(membership_id = c(12000000L, 12000001L, 12000001L,
12000001L, 12000001L, 12000003L, 12000003L, 12000000L, 12000000L
), created_date = structure(c(16455, 15663, 15985, 16135, 16449,
15744, 16135, 16106, 15345), class = "Date")), .Names = c("membership_id",
"created_date"), row.names = c("1", "2", "3", "4", "5", "6",
"7", "8", "9"), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)