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

问题描述 投票:0回答:1

我已经浏览了很多帖子,试图让我的代码工作但仍然有一些错误。我正在尝试根据不同的分组计算许多列的加权平均值。具体来说,我想计算由值列加权的特征加权平均值(在本例中为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]

但是所有它都删除了“值”列,这是我想用作我的权重。基本上,我想计算列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
r dplyr data.table weighted-average
1个回答
1
投票
dfnew <- setDT(df)[, lapply(.SD, function(x) weighted.mean(x, value, na.rm = TRUE)), by = c("year", "site"), .SDcols = wingL:proW]

我必须包含na.rm声明!我认为这给出了正确的结果。感谢大家帮助我思考,因为我通过分组确实有错误 - 过度思考。

它确实取代了原始值,但我可以接受它。

© www.soinside.com 2019 - 2024. All rights reserved.