【问题标题】:lag and cumulative sum by group滞后和按组累计和
【发布时间】:2023-02-25 15:45:44
【问题描述】:

对于具有三列的矩阵。

     ID     t      res
     1      1     -1.5
     1      2     -1.5
     1      3      0.5
     1      4      0.5
     2      1     -0.5
     2      2     -0.5
     2      3     -2.0
     2      4     -1.5
     2      5      1.5

我的目标是像这样按 ID 对列 res 的值求和。

   (-1.5*(-1.5+0.5+0.5)     - 1.5*(0.5+0.5)      + 0.5*(0.5))/(4-1) +
   (-0.5*(-0.5-2.0-1.5+1.5) - 0.5*(-2.0-1.5+1.5) - 2.0*(-1.5+1.5)  -1.5*(1.5))/(5-1) 
   =  -0.167 

非常感谢任何关于如何按组求和和划分的建议。

【问题讨论】:

    标签: r dataframe matrix lag cumsum


    【解决方案1】:
    library(dplyr)
    
    df1 %>% 
      group_by(ID) %>% 
      arrange(ID,  desc(t)) %>% 
      mutate(hlc = cumsum(lag(res, default =  0)) * res / (n()-1) ) %>% 
      pull(hlc) %>% sum()
    
    #> [1] -0.1666667
    

    数据:

    read.table(text = "     ID     t      res
         1      1     -1.5
         1      2     -1.5
         1      3      0.5
         1      4      0.5
         2      1     -0.5
         2      2     -0.5
         2      3     -2.0
         2      4     -1.5
         2      5      1.5", stringsAsFactors = F, header = T) -> df1
    

    【讨论】:

      【解决方案2】:

      这是一个基本的 R 解决方案。

      df1 <- "ID     t      res
           1      1     -1.5
           1      2     -1.5
           1      3      0.5
           1      4      0.5
           2      1     -0.5
           2      2     -0.5
           2      3     -2.0
           2      4     -1.5
           2      5      1.5"
      df1 <- read.table(text = df1, header = TRUE)
      
      
      out <- tapply(df1$res, df1$ID, FUN = (x) {
        sum(sapply(seq_along(x), (i) x[i]*sum(x[-(1:i)]))) / (length(x) - 1)
      })
      out <- sum(out)
      out
      #> [1] -0.1666667
      

      创建于 2023-02-25 reprex v2.0.2

      【讨论】:

        猜你喜欢
        • 2013-05-26
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多