好的,这是我希望使用高效、优雅的解决方案(例如 data.table 或 dplyr)解决的问题。

定义:

DT = data.table(group=c(rep("A",3),rep("B",5)),value=c(2,9,2,3,4,1,0,3))

   time group value
1:    1     A     2
2:    2     A     9
3:    3     A     2
4:    1     B     3
5:    2     B     4
6:    3     B     1
7:    4     B     0
8:    5     B     3

我试图得到的是一组值除以它们在观察到的那一刻的逆序的累积总和。
   time group value    RESULT
1:    1     A     2  2.000000
2:    2     A     9 10.000000
3:    3     A     2  7.166667
4:    1     B     3  3.000000
5:    2     B     4  5.500000
6:    3     B     1  4.000000
7:    4     B     0  2.583333
8:    5     B     3  4.933333

第 5 行的结果是:4/1 + 3/2 = 5.5因为在时间 2,B 组有 2 个观察,最后一个除以 1,前一个除以 1。
第 6 行的下一个结果是:1/1 + 4/2+ 3/3 = 4因为在时间 3,B 组有 3 个观察,最后一个除以 1,前一个除以 2,仍然前一个除以 3。在第 7 行, 0/1 + 1/2 + 4/3 + 3/4 = 2.583333 ,依此类推...

数据很大,所以避免循环是必不可少的!

最佳答案

我会使用矩阵代数:

n_max = DT[, .N, by=group][, max(N)]
m     = matrix(0, n_max, n_max)
m[]   = ifelse( col(m) >= row(m), 1 / (col(m) - row(m) + 1 ), m)

DT[, res := value %*% m[seq_len(.N), seq_len(.N)], by=group ]

   group value       res
1:     A     2  2.000000
2:     A     9 10.000000
3:     A     2  7.166667
4:     B     3  3.000000
5:     B     4  5.500000
6:     B     1  4.000000
7:     B     0  2.583333
8:     B     3  4.933333

关于r - 具有不同分母 R 的除法的累积和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39781527/

10-12 21:32