使用 r data.table 的行值与组中行总和的比率

Ratio of row value to sum of rows in a group using r data.table

我在r中有一个data.table,我已经总结并分组了。我现在想找到 yearquarter 每个 IDvalue 总和与 value 所有组总和的比率通过 yearquarter.

这似乎是一个足够常见的问题来询问数据,但我无法弄清楚如何使原本令人难以置信的 data.table return 成为答案。

我正在寻找的 table 看起来像这样(添加列 pct_byQtrYr):

    ID year quarter value pct_byQtrYr
 1:  A 2020       4   4.0       0.195
 2:  B 2020       4  10.5       0.512
 3:  C 2020       4   6.0       0.293
 4:  A 2021       1   6.6       0.293
 5:  B 2021       1  15.0       0.667
 6:  C 2021       1   0.9       0.040
 7:  A 2021       2   6.2       0.198
 8:  B 2021       2   9.8       0.313
 9:  C 2021       2  15.3       0.489
10:  A 2021       3   5.0       0.526
11:  B 2021       3   3.4       0.358
12:  C 2021       3   1.1       0.116

原始数据如下:

dt <- data.table(
        ID = c( "A", "B", "C",
               "A", "B", "C",
               "A", "B", "C",
               "A", "B", "C"), 
        year = c(
                 2020, 2020, 2020, 
                 2021, 2021, 2021,
                 2021, 2021, 2021,
                 2021, 2021, 2021), 
        quarter = c(4, 4, 4, 
                    1, 1, 1,
                    2, 2, 2,
                    3, 3, 3), 
        value = c(4, 10.5, 6,
                  6.6, 15, 0.9, 
                  6.2, 9.8, 15.3,
                  5, 3.4, 1.1))

您可以使用 prop.table 获得每个 yearquartervalue 的比率。

library(data.table)

dt[, pct_byQtrYr := prop.table(value), .(year, quarter)]
dt

#    ID year quarter value pct_byQtrYr
# 1:  A 2020       4   4.0   0.1951220
# 2:  B 2020       4  10.5   0.5121951
# 3:  C 2020       4   6.0   0.2926829
# 4:  A 2021       1   6.6   0.2933333
# 5:  B 2021       1  15.0   0.6666667
# 6:  C 2021       1   0.9   0.0400000
# 7:  A 2021       2   6.2   0.1980831
# 8:  B 2021       2   9.8   0.3130990
# 9:  C 2021       2  15.3   0.4888179
#10:  A 2021       3   5.0   0.5263158
#11:  B 2021       3   3.4   0.3578947
#12:  C 2021       3   1.1   0.1157895

这类似于将 value 除以组的 sum

dt[, pct_byQtrYr := value/sum(value), .(year, quarter)]