Рассчитать средневзвешенное значение для множественной группировки с разными весами в R - PullRequest
0 голосов
/ 22 февраля 2019

Я просмотрел множество постов на 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

1 Ответ

0 голосов
/ 22 февраля 2019
dfnew <- setDT(df)[, lapply(.SD, function(x) weighted.mean(x, value, na.rm = TRUE)), by = c("year", "site"), .SDcols = wingL:proW]

Я должен был включить оператор na.rm!Я думаю, что это дает правильные результаты.Спасибо всем, что помогли мне обдумать это, поскольку у меня были ошибки при группировании - я переборщил.

Он заменяет исходные значения, но я могу с этим смириться.

...