计算 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 声明!我认为这给出了正确的结果。感谢大家帮助我考虑清楚,因为我在分组时确实有错误 - 想多了。
它确实替换了原始值,但我可以接受。
我浏览了很多关于 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 声明!我认为这给出了正确的结果。感谢大家帮助我考虑清楚,因为我在分组时确实有错误 - 想多了。
它确实替换了原始值,但我可以接受。