首页 > 解决方案 > 在 R data.table 中按组修剪平均值

问题描述

我有一个 data.table,我想在其上按月查找列的加权平均值performance

  dat <- structure(list(year = c(2014, 2015, 2016, 2017, 2018, 2019, 2020, 
                                 2021, 2014, 2015, 2016, 2017, 2018, 2019, 2020), 
                        month = c(2, 
                                  2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10), 
                        performance = c(0.826973794097158, 
                                        0.61975709469356, 0.924350659523548, -0.183133219063708, -0.529913189565746, 
                                        -0.148531188902535, -0.0773058814083695, 1.42862504650241, 0.465498268732376, 
                                        0.148719963224136, 0.205614191281359, 0.560651497949418, -0.484408605607923, 
                                        0.875353374774486, 0.351469397380814)), 
                   row.names = c(NA, -15L), class = c("data.table", "data.frame"))

此 data.table 如下所示 -

    year month performance
 1: 2014     2  0.82697379
 2: 2015     2  0.61975709
 3: 2016     2  0.92435066
 4: 2017     2 -0.18313322
 5: 2018     2 -0.52991319
 6: 2019     2 -0.14853119
 7: 2020     2 -0.07730588
 8: 2021     2  1.42862505
 9: 2014    10  0.46549827
10: 2015    10  0.14871996
11: 2016    10  0.20561419
12: 2017    10  0.56065150
13: 2018    10 -0.48440861
14: 2019    10  0.87535337
15: 2020    10  0.35146940

要按月查找加权平均值,我使用了以下代码 -

setDT(dat)[, lapply(.SD, function(x) weighted.mean(x, na.rm = TRUE)), by = .(month), .SDcols = c("performance")]

我得到的结果是-

   month performance
1:     2   0.3576029
2:    10   0.3032712

但是,月份的加权平均表现10应该大于月份2,因为它具有更多的正值。

似乎只有22021 年的月份对其表现造成了沉重的压力,导致其表现优于当月的表现10。实际上,上面的代码只找到了mean而不是weighted.mean. 如果我使用mean而不是weighted.mean.

setDT(dat)[, lapply(.SD, function(x) mean(x, na.rm = TRUE)), by = .(month), .SDcols = c("performance")]

使用简单均值后的结果如下,与 weighted.mean 的结果相同。

   month performance
1:     2   0.3576029
2:    10   0.3032712

期望的结果应该对每一年的表现给予同等的重视,以便某一特定年份的卓越表现不会错误地表明该产品在每年该月的销售情况非常好。

有人能指出我的加权平均计算有什么问题吗?

标签: rdata.tableweighted-average

解决方案


作为一个新的stackoverflow用户,我无法在帖子中添加commnets,所以我将在这里添加我的疑问。

一般来说,你提供的代码是一个简单的平均值,我不清楚你想要什么,因为通常当你想要一个加权平均值时,你会使用第二个变量作为权重。

在您的情况下,一个简单的平均值返回相同的输出:

library(dplyr)

dat %>% 
  group_by(month) %>% 
  summarise(performance = mean(performance))

推荐阅读