计算r数据表中的滚动除法

时间:2017-11-10 18:09:34

标签: r data.table aggregate rolling-sum

我有一个这样的数据表:

   a group
1: 1     a
2: 2     a
3: 3     a
4: 4     a
5: 5     a
6: 6     a

可以从以下代码创建样本:

structure(list(a = 1:100, group = c("a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b")), .Names = c("a", "group"), row.names = c(NA, 
-100L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000004790788>)

对于每组中的每一行,我想:

  1. a
  2. 中获取值
  3. 将其除以列a中的值,滞后2并减去1
  4. 将其除以列a中的值,滞后4并减去1
  5. 将其除以列a中的值,滞后6并减去1
  6. 步骤2-4的总结并将其返回到新列
  7. 因此,对于第1-6行,我会NA,然后是7/5 + 7/3 + 7/1 - 38/6 + 8/4 + 8/2 - 39/7 + 9/5 + 9/3 - 310/8 + 10/6 + 10/4 - 3

    因此,根据第一个块中报告的表格,我想获得一个新列,比如说metric_1,它会在第10行显示值2.416667

    请注意,a列中的值实际上与行号不对应,但会进行一些测量。

    最终输出将如下所示:

         a group metric_1
     1:  1     a       NA
     2:  2     a       NA
     3:  3     a       NA
     4:  4     a       NA
     5:  5     a       NA
     6:  6     a       NA
     7:  7     a 7.733333
     8:  8     a 4.333333
     9:  9     a 3.085714
    10: 10     a 2.416667
    

    我已经尝试了Reduce的某些版本,如果我需要在向量中加总一些值,它就像冠军一样,但是我无法调整它以使我能够像这样进行划分。

2 个答案:

答案 0 :(得分:0)

我不确定这是否正是您正在寻找的,但也许会有所帮助:

library(dplyr)

the_data %>% group_by(group) %>% 
mutate(metric_1 = (a/lag(a, 2)-1)+( a/lag(a,4)-1) + (a/lag(a, 6) - 1 )) %>%
ungroup()

答案 1 :(得分:0)

找到了一个可能的解决方案:

dt[,
     list(a, Reduce(`+`, lapply(shift(a, seq(2, 6, by = 2)),
       function(x) a/x - 1))), 
     by = "group"]

但它很慢。