Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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_Dataframe_Sorting_Dplyr_Group By - Fatal编程技术网

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

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

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