【问题标题】:Calculating a rolling division in r data table计算 r 数据表中的滚动除法
【发布时间】:2017-11-10 18:09:33
【问题描述】:

我有一个这样的数据表:

   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. 除以 a 列中的值,滞后 2 并减去 1
  3. 除以a列中的值,滞后4并减去1
  4. 将其除以a 列中的值,滞后 6 并减去 1
  5. 将步骤 2-4 的结果求和并在新列中返回

所以对于第 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 的版本,如果我需要对向量中的一些值求和,它就像一个冠军,但我无法对其进行调整以使我能够像这样进行除法。

【问题讨论】:

    标签: r data.table aggregate rolling-sum


    【解决方案1】:

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

    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()
    

    【讨论】:

    • 谢谢,但我需要一些更具可扩展性的东西,因为我有数百万个观察结果,并且需要在超过 3 个不同的延迟上执行此操作。
    【解决方案2】:

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

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

    但是速度比较慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-13
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      相关资源
      最近更新 更多