группа «взвешенная» означает с несколькими переменными группирования и исключая значение собственной группы - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь получить средневзвешенное значение для группы с несколькими группирующими переменными и исключая значение собственной группы. Это связано с моим предыдущим постом Получить среднее значение для группы с несколькими группирующими переменными и исключить значение собственной группы , но когда я применил его к своему фактическому вопросу (который получает взвешенное среднее), я обнаружил, что это гораздо больше сложнее, чем получить простое среднее. Вот что я имею в виду под этим.

df <- data_frame(
  state = rep(c("AL", "CA"), each = 6),
  county = rep(letters[1:6], each = 2),
  year = rep(c(2011:2012), 6),
  value = c(91,46,37,80,33,97,4,19,85,90,56,94),
  wt = c(1,4,3,5,1,4,5,1,5,5,4,1)
) %>% arrange(state, year)

Для невзвешенного среднего значения должен работать следующий код (из принятого ответа моего предыдущего поста).

df %>%
  group_by(state, year) %>%
  mutate(q = (sum(value) - value) / (n()-1))

Требуемая переменная new_val, которая является средневзвешенным значением, будет следующей. Например, первые две строки столбца new_val рассчитываются как 37 * 3/4 ​​+ 33 * 1/4 = 36, 91 * 1/2 + 33 * 1/2 = 62.

# A tibble: 12 x 6
   state county  year value    wt new_val
   <chr> <chr>  <int> <dbl> <dbl>   <dbl>
 1 AL    a       2011    91     1    36  
 2 AL    b       2011    37     3    62
 3 AL    c       2011    33     1    50.5
 4 AL    a       2012    46     4    87.6  
 5 AL    b       2012    80     5    71.5
 6 AL    c       2012    97     4    64.9
 7 CA    d       2011     4     5    72.1
 8 CA    e       2011    85     5    27.1
 9 CA    f       2011    56     4    44.5
10 CA    d       2012    19     1    90.7
11 CA    e       2012    90     5    56.5
12 CA    f       2012    94     1    78.2

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

1 Ответ

1 голос
/ 20 января 2020

Мы можем использовать map_dbl для исключения текущей строки в расчете weighted.mean

library(dplyr)

df %>%
  group_by(state, year) %>%
  mutate(new_val = purrr::map_dbl(row_number(), 
                         ~weighted.mean(value[-.x], wt[-.x])))


#   state county  year value    wt new_val
#   <chr> <chr>  <int> <dbl> <dbl>   <dbl>
# 1 AL    a       2011    91     1    36  
# 2 AL    b       2011    37     3    62  
# 3 AL    c       2011    33     1    50.5
# 4 AL    a       2012    46     4    87.6
# 5 AL    b       2012    80     5    71.5
# 6 AL    c       2012    97     4    64.9
# 7 CA    d       2011     4     5    72.1
# 8 CA    e       2011    85     5    27.1
# 9 CA    f       2011    56     4    44.5
#10 CA    d       2012    19     1    90.7
#11 CA    e       2012    90     5    56.5
#12 CA    f       2012    94     1    78.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...