我有一个相对较大的数据框(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] 删除。
我来说两句