R按ID查找日期间隔

时间:2013-07-01 08:07:51

标签: r intervals datediff

使下表包含一些关键列:customer ID |订单ID |产品ID |数量|金额|订单日期。

所有这些数据都是LONG格式,因为您将获得1个客户ID的多行项目。

我可以使用R DateDiff获取第一个日期的最后日期,但是使用Plyr将文件转换为WIDE格式,最终会遇到客户获得多个订单的相同问题,只有更少的行和更多的列。

是否有R函数扩展R DateDiff以确定如何获取客户ID购买之间的时间间隔?也就是说,假设这些订单存在,订单1和2之间的时间,订单2和3,依此类推。

CID     Order.Date  Order.DateMY    Order.No_    Amount Quantity  Category.Name    Locality
1       26/02/13    Feb-13          zzzzz                   1       r                 MOSMAN
1       26/05/13    May-13          qqqqq                   1       x               CHULLORA
1       28/05/13    May-13           wwwww                  1       r               MOSMAN
1       28/05/13    May-13           wwwww                  1       x                 MOSMAN
2       19/08/13    Aug-13          wwwwww                  1       o                OAKLEIGH SOUTH
3       3/01/13    Jan-13           wwwwww                  1       x                 CURRENCY CREEK
4       28/08/13    Aug-13         eeeeeee                  1       t                 BRISBANE
4       10/09/13    Sep-13         rrrrrrrrr                1       y               BRISBANE
4       25/09/13    Sep-13         tttttttt                 2       e               BRISBANE

3 个答案:

答案 0 :(得分:2)

由于未给出预期结果,您不清楚自己想做什么。但我想你想要2个订单之间的间隔。

library(data.table)
DT <- as.data.table(DF)
DT[, list(Order.Date,
          diff = c(0,diff(sort(as.Date(Order.Date,'%d/%m/%y')))) ),CID]

   CID Order.Date diff
1:   1   26/02/13    0
2:   1   26/05/13   89
3:   1   28/05/13    2
4:   1   28/05/13    0
5:   2   19/08/13    0
6:   3    3/01/13    0
7:   4   28/08/13    0
8:   4   10/09/13   13
9:   4   25/09/13   15

答案 1 :(得分:1)

拆分数据框并找到每个客户ID的间隔。

df <- data.frame(customerID=as.factor(c(rep("A",3),rep("B",4))),
OrderDate=as.Date(c("2013-07-01","2013-07-02","2013-07-03","2013-06-01","2013-06-02",
"2013-06-03","2013-07-01")))

dfs <- split(df,df$customerID)
lapply(dfs,function(x){
tmp <-diff(x$OrderDate)
tmp
})

或使用plyr

library(plyr)
dfs <- dlply(df,.(customerID),function(x)return(diff(x$OrderDate)))

答案 2 :(得分:0)

我知道这个问题已经很老了,但我只是想出了另一种方法,想要记录它:

> library(dplyr)
> library(lubridate)
> df %>% group_by(customerID) %>% 
    mutate(SinceLast=(interval(ymd(lag(OrderDate)),ymd(OrderDate)))/86400)

# A tibble: 7 x 3
# Groups:   customerID [2]
  customerID OrderDate  SinceLast
  <fct>      <date>         <dbl>
1 A          2013-07-01       NA 
2 A          2013-07-02        1.
3 A          2013-07-03        1.
4 B          2013-06-01       NA 
5 B          2013-06-02        1.
6 B          2013-06-03        1.
7 B          2013-07-01       28.