Я просмотрел множество постов на 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]
Но все, что он делает, это удаляет столбец «значение», который я хочу использовать в качестве своих весов.По сути, я хочу вычислить средневзвешенное значение по строкам для столбцов 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