Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按不同用户分组的日期差异。_R - Fatal编程技术网

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

R 按不同用户分组的日期差异。,r,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 |

例如,如果我有这样一个数据帧:

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()来实现这一点,但我无法理解为每个不同的用户执行此操作的步骤,尤其是无法找出如何在数据框的同一列中为每个日期执行此操作

假设您的
Date
列已经是
Date
类,您可以使用
数据进行操作。表
包:

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

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
dat-dat
日期用户ID差异
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

是的,就是这样。我想我会熟悉data.table包,以备将来参考。谢谢