2016-05-15 105 views
0

如果我有例如像这样的数据帧:按不同用户分组的日期差异。

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

假设你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 
+0

是的,这样做。将我自己熟悉data.table包以备将来参考。谢谢 – Taha

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