如何通过ID有效地计算地图中的difftime

时间:2014-03-07 09:28:48

标签: r date map

鉴于以下数据:

       cdate    cid cprice
1  2013-05-24 **275059**  74.99
2  2013-04-15 **275059**  63.10
3  2013-03-12 **275059**  40.39
4  2013-09-03 276620  62.09
5  2013-03-27 276261  34.11
6  2012-12-20 276136  60.96
7  2013-01-25 276136  69.96
8  2012-11-23 276136 105.17
9  2012-11-09 276136  73.20
10 2013-01-09 276136  73.40

我想有效地计算(获得超过2百万行)他上次购买日期的每个客户(cid列)与当前白天的差异(以天为单位)。

类似的东西:

getrecense <- function(f){ return(as.integer(difftime(format(Sys.Date(),"%Y-%m-%d"), max(f$cdate)))); }
recence <- data.frame(as.table(by(clients, clients$cid, getrecence)));

完全符合我的要求,但根本无法扩展。

2 个答案:

答案 0 :(得分:3)

DF <- read.table(text="       cdate    cid cprice
1  2013-05-24 **275059**  74.99
2  2013-04-15 **275059**  63.10
3  2013-03-12 **275059**  40.39
4  2013-09-03 276620  62.09
5  2013-03-27 276261  34.11
6  2012-12-20 276136  60.96
7  2013-01-25 276136  69.96
8  2012-11-23 276136 105.17
9  2012-11-09 276136  73.20
10 2013-01-09 276136  73.40", header=TRUE)


library(data.table)
DT <- data.table(DF)
DT[, cdate:=as.Date(cdate)]
DT[, Sys.Date()-max(cdate), by=cid]
#          cid       V1
#1: **275059** 287 days
#2:     276620 185 days
#3:     276261 345 days
#4:     276136 406 days

DT[, as.integer(Sys.Date()-max(cdate)), by=cid]
#          cid  V1
#1: **275059** 287
#2:     276620 185
#3:     276261 345
#4:     276136 406

答案 1 :(得分:1)

相应的dplyr替代方案:

library(dplyr)

DF$cdate <- as.Date(DF$cdate)

DF %.%
  group_by(cid) %.%
  summarise(
  diff_num = as.integer(Sys.Date() - max(cdate)))

#          cid diff_num
# 1 **275059**      287
# 2     276136      406
# 3     276261      345
# 4     276620      185