Добавление общего среднего значения при использовании group_by - PullRequest
0 голосов
/ 24 октября 2018

Я использую пакет dplyr для генерации некоторых таблиц и использую функцию adorn_totals("row").

Это прекрасно работает, когда я хочу суммировать значения внутри групп, однако в некоторых случаях яхочу общее среднее вместо суммы.Есть ли функция adorn_means?

Пример кода:

Regions2 <- Data %>%
  filter(!is.na(REGION))%>%
  group_by(REGION) %>%
  summarise(Numberofpeople=length(Names))%>%
  adorn_totals("row")

здесь моя строка "Всего" - это просто сумма всех людей в регионах.Это дает мне

REGION          NumberofPeople
East Midlands       578,943
East of England     682,917
London            1,247,540
North East          245,830
North West          742,886
South East          963,040
South West          623,684
West Midlands       653,335
Yorkshire           553,853
TOTAL             6,292,028

Мой следующий фрагмент кода генерирует среднюю зарплату для каждого региона, но я хочу добавить общее среднее значение для общей суммы

Regions3 <- Data %>%
  filter(!is.na(REGION))%>%
  filter(!is.na(AVGSalary))%>%
  group_by(REGION) %>%
  summarise(AverageSalary=mean(AVGSalary))

, если я использую adnorn_totals("row") как и раньше, я просто получаю сумму средних значений, а не общее среднее для набора данных.

Как получить общее среднее значение?

ОБНОВЛЕНИЕ с некоторыми нудными данными:

Данные

people  region      salary
person1 London      1000
person2 South West  1050
person3 South East  900
person4 London      800
person5 Scotland    1020
person6 South West  750
person7 East        600
person8 London      1200
person9 South West  1150

Следовательно, средние значения по группе:

London      1000
South West  983.33
South East  900
Scotland    1020
East        600

Я хочу добавить общую сумму к нижней части

Total    941.11

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

1) Поскольку общее среднее значение представляет собой средневзвешенное значение средних значений (а не обычное среднее значений средних значений), т. Е. Это 941, а не 901, мы поддерживаем столбец n, так что вВ конце мы можем правильно рассчитать общее среднее.Хотя показанные данные не имеют никаких NA, мы используем drop_na, чтобы также использовать их с такими данными.Это удалит любую строку, содержащую NA.

library(dplyr)
library(tidyr)

Region %>%
  drop_na %>%
  group_by(region) %>%
  summarize(avg = mean(salary), n = n()) %>%
  ungroup %>%
  bind_rows(summarize(., region = "Overall Avg", 
                         avg = sum(avg * n) / sum(n), 
                         n = sum(n))) %>%
  select(-n)

, что дает:

# A tibble: 6 x 2
  region        avg
  <chr>       <dbl>
1 East         600 
2 London      1000 
3 Scotland    1020 
4 South East   900 
5 South West   983.
6 Overall Avg  941.

2) Другой подход - построить общую линию Avg, вернувшись назад.к исходным данным:

Region %>%
  drop_na %>%
  group_by(region) %>%
  summarize(avg = mean(salary)) %>%
  ungroup %>%
  bind_rows(summarize(Region %>% drop_na, region = "Overall Avg", avg = mean(salary)))

, давая:

# A tibble: 6 x 2
  region        avg
  <chr>       <dbl>
1 East         600 
2 London      1000 
3 Scotland    1020 
4 South East   900 
5 South West   983.
6 Overall Avg  941.

2a) Если вы возражаете против ссылки на Region дважды, попробуйте это.

Region_ <- Region %>% 
  drop_na

Region_ %>%
  group_by(region) %>%
  summarize(avg = mean(salary)) %>%
  ungroup %>%
  bind_rows(summarize(Region_, region = "Overall Avg", avg = mean(salary)))

2b) или как отдельный конвейер, где теперь Region_ является локальным для конвейера и будет автоматически удалено после его завершения:

Region %>%
  drop_na %>%
  { Region_ <- .
    Region_ %>%
      group_by(region) %>%
      summarize(avg = mean(salary)) %>%
      ungroup %>%
      bind_rows(summarize(Region_, region = "Overall Avg", avg = mean(salary)))
  }

Примечание

Мы использовали это как ввод:

Lines <- "people  region      salary
person1 London      1000
person2 South West  1050
person3 South East  900
person4 London      800
person5 Scotland    1020
person6 South West  750
person7 East        600
person8 London      1200
person9 South West  1150"

library(gsubfn)
Region <- read.pattern(text = Lines, pattern = "^(\\S+) +(.*) (\\d+)$", 
  as.is = TRUE, skip = 1, strip.white = TRUE,
  col.names = read.table(text = Lines, nrow = 1, as.is = TRUE))
0 голосов
/ 24 октября 2018

Один из вариантов - добавить строку с bind_rows

library(dplyr)
Data %>% 
   group_by(region) %>% 
   summarise(Avgsalary = mean(salary)) %>%
   bind_rows(data_frame(region = 'Total',
                        Avgsalary = mean(.$Avgsalary, na.rm = TRUE)))

Или другой вариант - add_row из tibble

Data %>% 
   group_by(region) %>% 
   summarise(Avgsalary = mean(salary)) %>% 
   add_row(region = 'Total', Avgsalary = mean(.$Avgsalary))

Если это основанопо общему среднему значению до взятия mean, то нам нужно вычислить его до

Data %>%  
  mutate(Total = mean(salary)) %>% 
  group_by(region) %>%
  summarise(Avgsummary = mean(salary), Total = first(Total)) %>% 
  add_row(region = 'Total', Avgsummary = .$Total[1]) %>% 
  select(-Total)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...