R 对数据帧进行排序并创建新的瞬时列
我有一个相对较大的数据框(150万行和5列)。为了简单起见,我在下面创建了一个示例数据框:R 对数据帧进行排序并创建新的瞬时列,r,dataframe,sorting,dplyr,group-by,R,Dataframe,Sorting,Dplyr,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
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
2017年4月13日之前没有观察结果,因此比率为0,2017年9月12日之前有一个观察结果,TV_ad=1,所以1/1=1,2018年5月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
的累积平均值,但由于您不想在计算中包括当前日期,您可以延迟它:
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
您可以计算每个ID
的累积平均值,但由于您不想在计算中包括当前日期,因此可以延迟
它:
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))