我已经浏览了很多帖子,试图让我的代码工作但仍然有一些错误。我正在尝试根据不同的分组计算许多列的加权平均值。具体来说,我想计算由值列加权的特征加权平均值(在本例中为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
dfnew <- setDT(df)[, lapply(.SD, function(x) weighted.mean(x, value, na.rm = TRUE)), by = c("year", "site"), .SDcols = wingL:proW]
我必须包含na.rm声明!我认为这给出了正确的结果。感谢大家帮助我思考,因为我通过分组确实有错误 - 过度思考。
它确实取代了原始值,但我可以接受它。