计算 R 中具有不同权重的多个分组的加权均值

Calculate weighted means for multiple grouping with different weightings in R

我浏览了很多关于 SO 的帖子,试图让我的代码正常工作,但仍然有一些错误。我正在尝试根据不同的分组计算许多列的加权平均值。 具体来说,我想计算由值列加权的特征(在本例中为 wingL、wingW 等)的加权平均值。

这是一个样本数据集(因为我的矩阵很大)和一些代码:

>df
    year site  Species value  wingL  wingW   proL proW 
    2018    2    Aa      3.0   310.6  54.9   NA   1.1       
    2017    2    Aa      1.0   310.6  54.9   NA   1.1 
    2018    2    Bb      7.5    NA    20     3    1.0    
    2017    2    Bb      5      NA    20     3    1.0
    2018    4    Aa      8     310.6  54.9   NA   1.1       
    2017    4    Aa      6     310.6  54.9   NA   1.1
    2018    4    Cc      1    161.20   143.8  NA   NA 
    2017    4    Cc      1    161.20   143.8  NA   NA
    2018    6    Aa      12    310.6   54.9   NA   1.1  
    2018    6    Aa      9.5   310.6   54.9   NA   1.1
    2018    6    Cc      7    161.20   143.8  NA   NA 
    2017    6    Cc      7    161.20   143.8  NA   NA

这是我的代码:

dfnew <- setDT(df)[, lapply(.SD, function(x) weighted.mean(x, value)),
                       by = c("year", "Species"), .SDcols  = wingL:proW]

但它所做的一切都删除了 "value" 列,这是我想用作权重的列。 基本上,我想计算列 wingL:proW 的跨行加权平均值。然后,一旦我有了这些数据,我最终将对每个站点的所有物种(Aa、Bb)进行平均。

使用下面的代码,我能够正确地创建一个只有一个新列的新 df(wingL_wm),但无法弄清楚如何为我拥有的许多列扩展它::

dfnew <- df %>% 
          group_by(year, site) %>%
          summarise(wingL_wm = weighted.mean(wingL, value))

希望这是有道理的。谢谢您的帮助 这是一个通用的期望输出,尽管 "x" 应该是计算的加权平均值:

year site   wingL_WM  wingW_WM   proL_WM proW_WM
2018    2       x        x         x        x       
2017    2       x        x         x        x
2018    4       x        x         x        x
2017    4       x        x         x        x
2018    6       x        x         x        x    
2017    6       x        x         x        x
dfnew <- setDT(df)[, lapply(.SD, function(x) weighted.mean(x, value, na.rm = TRUE)), by = c("year", "site"), .SDcols = wingL:proW]

我必须包含 na.rm 声明!我认为这给出了正确的结果。感谢大家帮助我考虑清楚,因为我在分组时确实有错误 - 想多了。

它确实替换了原始值,但我可以接受。