在r中调用先前观察的数据帧中的前滚滚动窗口

时间:2017-08-24 21:20:54

标签: r loops dataframe dplyr data.table

我正在尝试创建一个函数来应用于数据框中的变量,对于当前观察前2天的窗口,计算变量以正数变化的天数。

数据框如下所示:

VarA     VarB     Date         Diff
 1         1      2007-04-09    NA 
 1         1      2007-04-10    0  
 1         1      2007-04-11   -2  
 1         1      2007-04-12    0  
 1         1      2007-04-13    2  
 1         1      2007-04-14    0  
 1         1      2007-04-15   -2  
 1         1      2007-04-16    1  
 1         1      2007-04-17   -4  
 1         1      2007-04-18    0  
 1         1      2007-04-17    0  
 1         1      2007-04-18    0  

我想在以下情况下创建一个新变量:

  1. 对于每个VarA,每个VarB和每个Date,如果Diff不是负数(可能是NA),则为新变量赋值0
  2. 如果Diff具有负数,则为该日期观察分配1,然后为下一个分配:a)在达到负Diff后最多两天;或b)如果Diff在两天限制之前和之后的天数与零不同。在这两种情况下,VarC都应该再次为0。
  3. 它应如下所示:

         VarA     VarB     Date         Diff   VarC
          1         1      2007-04-09    NA     0
          1         1      2007-04-10    0      0
          1         1      2007-04-11   -2      1
          1         1      2007-04-12    0      1
          1         1      2007-04-13    2      0
          1         1      2007-04-14    0      0
          1         1      2007-04-15   -2      1
          1         1      2007-04-16    1      0
          1         1      2007-04-17   -4      0
          1         1      2007-04-18    0      0
          1         1      2007-04-17    0      0
          1         1      2007-04-18    0      0
    

    我尝试过以下代码:

    db$VarC <- 0
    
    for (i in unique(db$VarA)) {
     for (j in unique(db$VarB)) {
      subset.data.frame(db, VarA == i & VarB == j)
       for (n in 1 : lenght(db$Date)) db$VarC[n] <- 
         ifelse(db$Diff[n] < 0, 1,                                                         
         ifelse (db$VarC[n-1] ==1 && db$Diff[n] <0, 1, 0))
    }
    }
    

    但问题是脚本耗费太多时间。我必须运行它以进行1亿次观测,并且它可以运行数天。我尝试使用dplyr并调用.Last.value函数,如下所示:

    db <- db %>% group_by(VarA, VarB) %>% rowwise() %>% 
     mutate( VarC = ifelse(Diff <0, 1 , ifelse(.Last.value == 1 & Diff < 
       0, 1, 0))) )
    

    但问题是dplyr(据我所知,data.table)无法处理算法中隐含的“检查上一行”。使用lag也无济于事。我想知道是否有更快的方法可以做到这一点。

0 个答案:

没有答案