Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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_Sum_Dataframe - Fatal编程技术网

R//根据日期范围求和

R//根据日期范围求和,r,sum,dataframe,R,Sum,Dataframe,假设我有一个如下的数据框(仅前3列),其中sum是例如客户用户在日期当天产生的收入: user date sum sum(previous5days) A 2013-01-01 10 0 A 2013-01-02 20 10 A 2013-01-03 10 30 A 2013-01-05 5 40 A 2013-01-06 6 45 A 2013-01-08 7 21 A 2013-01-09 4 22 A 2013

假设我有一个如下的数据框(仅前3列),其中sum是例如客户用户在日期当天产生的收入:

user    date    sum sum(previous5days)
A   2013-01-01  10  0
A   2013-01-02  20  10
A   2013-01-03  10  30
A   2013-01-05  5   40
A   2013-01-06  6   45
A   2013-01-08  7   21
A   2013-01-09  4   22
A   2013-01-10  0   22
B   2013-01-06  1   0
B   2013-01-07  1   1
现在我想计算第4列[总和(以前的5天)],这是客户用户在特定日期的前5天(不包括实际日期)内的总收入。必须对每行进行此计算

我如何在不使用循环的情况下做到这一点,因为数据量相当大,循环不是一个选项


非常感谢

使用
data.table
您可以检索键:

library(data.table)
DT <- data.table(<yourdata>)
setkey(DT, user, date)

DT[, sumSum := DT[ .(.BY[[1]], .d+(-5:-1) )][, sum(sum, na.rm=TRUE)] , by=list(user, .d=date)]
DT
#      user       date sum sum.previous5days. sumSum
#   1:    A 2013-01-01  10                  0      0
#   2:    A 2013-01-02  20                 10     10
#   3:    A 2013-01-03  10                 30     30
#   4:    A 2013-01-05   5                 40     40
#   5:    A 2013-01-06   6                 45     45
#   6:    A 2013-01-08   7                 21     21
#   7:    A 2013-01-09   4                 22     18   <~~~ Discrepency
#   8:    A 2013-01-10   0                 22     22
#   9:    B 2013-01-06   1                  0      0
#  10:    B 2013-01-07   1                  1      1
库(data.table)

DT使用
数据。表
您可以检索键:

library(data.table)
DT <- data.table(<yourdata>)
setkey(DT, user, date)

DT[, sumSum := DT[ .(.BY[[1]], .d+(-5:-1) )][, sum(sum, na.rm=TRUE)] , by=list(user, .d=date)]
DT
#      user       date sum sum.previous5days. sumSum
#   1:    A 2013-01-01  10                  0      0
#   2:    A 2013-01-02  20                 10     10
#   3:    A 2013-01-03  10                 30     30
#   4:    A 2013-01-05   5                 40     40
#   5:    A 2013-01-06   6                 45     45
#   6:    A 2013-01-08   7                 21     21
#   7:    A 2013-01-09   4                 22     18   <~~~ Discrepency
#   8:    A 2013-01-10   0                 22     22
#   9:    B 2013-01-06   1                  0      0
#  10:    B 2013-01-07   1                  1      1
库(data.table)

DT查看
rollsum
zoo
中的其他
roll*
函数。查看
rollsum
zoo
中的其他
roll*
函数。非常感谢!如果日期为POSIXlt格式,并且我希望聚合前5秒/分钟/小时的事务,我将如何调整您的脚本?将列(或添加新列)转换为
as.ITime
。然后按秒数移动。(即
+5*60
分钟,
+5*60*60
5小时)非常好用,非常感谢!如果日期为POSIXlt格式,并且我希望聚合前5秒/分钟/小时的事务,我将如何调整您的脚本?将列(或添加新列)转换为
as.ITime
。然后按秒数移动。(即分钟为
+5*60
,5小时为
+5*60*60