如果我有这样的数据框,例如:
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(),但不能围绕为每个不同用户执行此操作的步骤,特别是无法弄清楚如何执行此操作对于我的数据框的同一列中的每个日期。
答案 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