按组计算滞后和累积总和

4

对于一个有三列的矩阵。

     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 

有没有关于如何按组求和和除法的建议,将不胜感激。

3个回答

3
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年2月25日,使用reprex v2.0.2

1

使用data.table

library(data.table)
 setDT(df1)[order(ID, -t),  hlc := cumsum(shift(res, fill = 0)) * res/(.N-1), ID]

-输出

> sum(df1$hlc)
[1] -0.1666667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接