Расчет пропорций и игнорирование нп

У меня есть набор данных, подобный приведенному ниже, и моя конечная цель - составить таблицу, в которой будут показаны такие переменные, как средняя заработная плата по полу и средняя заработная плата женщин как доля мужчин.

library(dplyr)
x <- data.frame(Department = c("Dep1", "Dep1","Dep2", "Dep2","Dep3"),
            Gender = c("F", "M",  "F", "M", "F"),
            Salary = seq(10,14))

      Department Gender Salary
1       Dep1      F     10
2       Dep1      M     11
3       Dep2      F     12
4       Dep2      M     13
5       Dep3      F     14

Шаг 1: Сначала я вычисляю необходимую сводную статистику с помощью summarize.

Table <- x %>% group_by(Department, Gender) %>% summarise(Count = n(),
                                                      AverageSalary = mean(Salary, na.rm = T),
                                                      MedianSalary = median(Salary, na.rm = T))

Шаг 2: Чтобы вычислить пропорцию и добавить новые столбцы в «Таблицу», я использую совет, полученный на этом форуме несколько дней назад.

Table %>% group_by(Department) %>% 
mutate(`AvgSalaryWomen/Men` = AverageSalary[Gender == "F"]/AverageSalary[Gender == "M"],
     `MedianSalaryWomen/Men` = MedianSalary[Gender == "F"]/MedianSalary[Gender == "M"])

Моя проблема в том, что в Dep3 нет мужчин, поэтому я получаю следующее сообщение об ошибке:

Error in mutate_impl(.data, dots) : 
Column `AvgSalaryWomen/Men` must be length 1 (the group size), not 0

Я надеялся на что-то вроде этого

  Department Gender Count AverageSalary MedianSalary AvgSalaryWomen.Men MedianSalaryWomen.Men
1       Dep1      F     1            10           10          0.9090909             0.9090909
2       Dep1      M     1            11           11          0.9090909             0.9090909
3       Dep2      F     1            12           12          0.9230769             0.9230769
4       Dep2      M     1            13           13          0.9230769             0.9230769
5       Dep3      F     1            14           14                 NA                    NA

или это

  Department Gender Count AverageSalary MedianSalary AvgSalaryWomen.Men MedianSalaryWomen.Men
1       Dep1      F     1            10           10          0.9090909             0.9090909
2       Dep1      M     1            11           11                 NA                    NA
3       Dep2      F     1            12           12          0.9230769             0.9230769
4       Dep2      M     1            13           13                 NA                    NA
5       Dep3      F     1            14           14                 NA                    NA

Есть ли простой способ получить любой из этих двух результатов? Я предполагаю, что вариант 1 будет самым простым. Заранее спасибо!

1
0
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя ifelse, вы можете проверить, существуют ли оба пола в отделе, прежде чем вычислять соотношения (и, если нет, возвращая NA). Что-то вроде этого:

Table %>% group_by(Department) %>% 
  mutate(`AvgSalaryWomen/Men` = ifelse(length(unique(Gender)) == 2,
         AverageSalary[Gender == "F"]/AverageSalary[Gender == "M"], NA),
         `MedianSalaryWomen/Men` = ifelse(length(unique(Gender)) == 2, 
          MedianSalary[Gender == "F"]/MedianSalary[Gender == "M"], NA))
# A tibble: 5 x 7
# Groups:   Department [3]
  Department Gender Count AverageSalary MedianSalary `AvgSalaryWomen/Men` `MedianSalaryWomen/Men`
  <fct>      <fct>  <int>         <dbl>        <int>                <dbl>                   <dbl>
1 Dep1       F          1          10.0           10                0.909                   0.909
2 Dep1       M          1          11.0           11                0.909                   0.909
3 Dep2       F          1          12.0           12                0.923                   0.923
4 Dep2       M          1          13.0           13                0.923                   0.923
5 Dep3       F          1          14.0           14               NA                      NA

Другие вопросы по теме