对数据框进行排序并创建新的瞬时列

Roozbeh_you

我有一个相对较大的数据框(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

我想要做什么,对于每个特定的 ID,在特定的时间,我想计算该人在之前所有日期使用 TV_ad 的次数对于此示例数据集,结果将是(结果按 ID 和日期排序):

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

在 2017-04-13 之前没有观察所以比率为 0,在 2017-09-12 之前,有一个观察并且 TV_ad=1 所以 1/1=1,在 2018-05-15 之前有两个观察并且来自那些两个我们有 TV_ad=1 其中一个所以比率是 1/2=0.5 等等......在@det提出的另一个解决方案中

library(dplyr)   

result %>%
  arrange(ID, date) %>%
  group_by(ID) %>%
  mutate(ratio = cumsum(TV_ad) / seq_len(n())) 

但是,此解决方案考虑了我们所在的行,而我想计算与我们正在计算的行的比率。我想也许我们可以使用以下等式

ratio1 = (cumsum(TV_ad)) / seq_len(n()-1), ratio2=TV_ad/seq_len(n()-1))

以及从比率 1 中减去比率 2。

此解决方案适用于所有列;然而,对于每组的第一列,由于 seq_len(n()==1 和 1-1=0,它返回 NAN 或无效数字

有什么建议吗?谢谢

罗纳克·沙阿

您可以计算每个的累积平均值,ID但由于您不想在计算中包含当前日期,因此可以lag

library(dplyr)

result %>%
  arrange(ID, date) %>%
  group_by(ID) %>%
  mutate(ratio = lag(cummean(TV_ad), default = 0))

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

同样的概念也可以应用于您当前的解决方案。

result %>%
  arrange(ID, date) %>%
  group_by(ID) %>%
  mutate(ratio = lag(cumsum(TV_ad) / seq_len(n()), default = 0))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章