R 对数据帧进行排序并计算列的瞬时值

R 对数据帧进行排序并计算列的瞬时值,r,dataframe,date,sorting,group-by,R,Dataframe,Date,Sorting,Group By,我有一个相对较大的数据框150万行和5列。为了简单起见,我在下面创建了一个示例数据框: date <- c("2018-07-06","2017-04-13","2017-09-12","2018-09-19" ,"2019-03-04","2017-05-21","2018-05-15") data <- as.Date(d

我有一个相对较大的数据框150万行和5列。为了简单起见,我在下面创建了一个示例数据框:

date <- c("2018-07-06","2017-04-13","2017-09-12","2018-09-19"
          ,"2019-03-04","2017-05-21","2018-05-15")
data <- as.Date(date)
TV_ad<-c(0,1,0,0,1,0,1)
ID <- c(1315769,1300620,1300620,1315769,1300620,1315769,1300620)
result <- data.frame(ID,TV_ad,date)


       ID TV_ad       date
1 1315769     0 2018-07-06
2 1300620     1 2017-04-13
3 1300620     0 2017-09-12
4 1315769     0 2018-09-19
5 1300620     1 2019-03-04
6 1315769     0 2017-05-21
7 1300620     1 2018-05-15
然后我可以计算每行的比率。对于第一行,第二行为1/1=1,第三行为1/2=0.5,第三行为2/3=0.66,第四行为3/4=0.75

我得到这个结果:

       ID TV_ad       date ratio
1 1315769     0 2018-07-06  0.00
2 1300620     1 2017-04-13  1.00
3 1300620     0 2017-09-12  0.50
4 1315769     0 2018-09-19  0.00
5 1300620     1 2019-03-04  0.75
6 1315769     0 2017-05-21  0.00
7 1300620     1 2018-05-15  0.66

但是,在我的大型数据集上,这种方法会非常耗时。有没有加快计算速度的建议?

您不需要分割数据,您可以使用dplyr在1 data.frame上完成所有操作:

给出:

       ID TV_ad date       ratio
    <dbl> <dbl> <fct>      <dbl>
1 1300620     1 2017-04-13 1    
2 1300620     0 2017-09-12 0.5  
3 1300620     1 2018-05-15 0.667
4 1300620     1 2019-03-04 0.75 
5 1315769     0 2017-05-21 0    
6 1315769     0 2018-07-06 0    
7 1315769     0 2018-09-19 0 

您不需要按ID排序这纯粹是为了输出文本的可见性

您不需要分割数据,您可以使用dplyr在1个data.frame上完成所有操作:

> result_ord <- result[order(result$ID, result$date), ]
> result_ord$cumAvg_by_ID <- ave(result_ord$TV_ad, list(result_ord$ID), FUN=function(x) cumsum(x) / 1:length(x) )
给出:

       ID TV_ad date       ratio
    <dbl> <dbl> <fct>      <dbl>
1 1300620     1 2017-04-13 1    
2 1300620     0 2017-09-12 0.5  
3 1300620     1 2018-05-15 0.667
4 1300620     1 2019-03-04 0.75 
5 1315769     0 2017-05-21 0    
6 1315769     0 2018-07-06 0    
7 1315769     0 2018-09-19 0 
您不需要按ID排序,这纯粹是为了输出文本的可见性

> result_ord <- result[order(result$ID, result$date), ]
> result_ord$cumAvg_by_ID <- ave(result_ord$TV_ad, list(result_ord$ID), FUN=function(x) cumsum(x) / 1:length(x) )
如上@det所述,只需按日期订购是绝对必要的

参考:

如上@det所述,只需按日期订购是绝对必要的

参考:

有没有办法改变这一点,所以我们计算出我们感兴趣的行的比率?所以基本上,例如,今天是2018—05-15,我想计算这个点的比率,但只考虑TVAAD,直到那个时候,我在考虑MutaTrimaTo1=CuMuxTvvAd/SeqLeLn-1,ratio2=TV_ad/seq_lenn-1,但这将导致每个数据帧的第一行出现NAN,因为1-1等于0取决于您希望输出的样子,如果您希望删除其余行,则可以在计算filterdate之前以及在开始时将filter添加到管道中,您需要使用:mutatedate=as.Dateas.characterdate将日期从factor转换为date类。是否有任何方法可以更改此值,因此我们计算出我们感兴趣的行的比率?所以基本上,例如,今天是2018—05-15,我想计算这个点的比率,但只考虑TVAAD,直到那个时候,我在考虑MutaTrimaTo1=CuMuxTvvAd/SeqLeLn-1,ratio2=TV_ad/seq_lenn-1,但这将导致每个数据帧的第一行出现NAN,因为1-1等于0取决于您希望输出的样子,如果您希望删除其余行,则可以在计算filterdate之前以及在开始时将filter添加到管道中,您需要使用:mutatedate=as.Dateas.characterdate将日期从factor转换为date类
> result_ord <- result[order(result$ID, result$date), ]
> result_ord$cumAvg_by_ID <- ave(result_ord$TV_ad, list(result_ord$ID), FUN=function(x) cumsum(x) / 1:length(x) )
> result_ord
       ID TV_ad       date cumAvg_by_ID
2 1300620     1 2017-04-13    1.0000000
3 1300620     0 2017-09-12    0.5000000
7 1300620     1 2018-05-15    0.6666667
5 1300620     1 2019-03-04    0.7500000
6 1315769     0 2017-05-21    0.0000000
1 1315769     0 2018-07-06    0.0000000
4 1315769     0 2018-09-19    0.0000000
>