由不同用户分组的日期差异。

时间:2016-05-15 15:18:17

标签: r

如果我有这样的数据框,例如:

Date        |    UserId
2016-05-20  |      1100 
2016-05-22  |      1100
2016-05-23  |      1100
2016-05-25  |      1200
2016-05-26  |      1200

如何找到自上次输入以来每个不同用户的日/周/月日期差异。输出可能如下所示:

Date        |    UserId  | Diff  
2016-05-20  |      1100  | 0
2016-05-22  |      1100  | 2 days
2016-05-23  |      1100  | 1 day
2016-05-25  |      1200  | 0
2016-05-26  |      1200  | 1 day

我知道我必须为此使用difftime(),但不能围绕为每个不同用户执行此操作的步骤,特别是无法弄清楚如何执行此操作对于我的数据框的同一列中的每个日期。

2 个答案:

答案 0 :(得分:2)

假设您的Date列已经是Date类,您可以使用data.table包:

library(data.table)
setDT(df)[,Diff:= c(0, diff.Date(Date)), .(UserId)]
df
         Date UserId Diff
1: 2016-05-20   1100    0
2: 2016-05-22   1100    2
3: 2016-05-23   1100    1
4: 2016-05-25   1200    0
5: 2016-05-26   1200    1

答案 1 :(得分:1)

ave函数用于构造按组计算的向量。如果第一列的类仍然是字符或因子,则可以使用as.numeric(as.Date(Date))作为ave的第一个参数。

dat <- read.table(text="Date|UserId
 2016-05-20|1100 
 2016-05-22|1100
 2016-05-23|1100
 2016-05-25|1200
 2016-05-26|1200", header = TRUE, sep="|", colClasses=c("Date", "numeric"))

dat$Diff= with(dat, ave(as.numeric(Date)  , UserId, FUN=function(x){c(0, diff(x) )}))
> dat
        Date UserId Diff
1 2016-05-20   1100    0
2 2016-05-22   1100    2
3 2016-05-23   1100    1
4 2016-05-25   1200    0
5 2016-05-26   1200    1