创建两个条件的比例列

时间:2018-04-06 11:23:37

标签: r

我有一个包含大约50个变量的数据框,但下面示例中的变量最重要。我的目标是创建一个表格,其中包括按部门和性别划分的各种元素。 dplyr,group_by和summarize的组合为我提供了我所需要的大部分内容,但我还没有找到如何获得单独的列,例如显示每个部门的meanFemaleSalary / meanMaleSalary。我可以在不同的数据框中获得每个部门的每个性别的平均工资,但是当我尝试将它们分开时,要么得到错误,要么只得到一个值。

我试过搜索网站,发现我认为是类似的问题,但无法得到任何有效的答案。如果有人能给我一个关于如何继续的提示,我将不胜感激...... 谢谢!

示例:

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

这就是我到目前为止实际工作的内容:

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

我想为AvgSalaryWomen / Men和MedianSalaryWomen / Men增加两列。 再次感谢!

3 个答案:

答案 0 :(得分:2)

如果您希望新列成为Table的一部分,您可以执行此类操作。但它会导致每个部门重复该值。

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

# Department Gender Count AverageSalary MedianSalary `AvgSalaryWomen/Men` `MedianSalaryWomen/Men`
# <fct>      <fct>  <int>         <dbl>        <int>                <dbl>                   <dbl>
# 1 Dep1       F          1           10.           10                0.769                   0.769
# 2 Dep1       M          1           13.           13                0.769                   0.769
# 3 Dep2       F          1           14.           14                1.27                    1.27 
# 4 Dep2       M          1           11.           11                1.27                    1.27 
# 5 Dep3       F          1           12.           12                0.800                   0.800
# 6 Dep3       M          1           15.           15                0.800                   0.800

如果您希望每个部门只需一行,只需将mutate更改为summarise即可获得

# Department `AvgSalaryWomen/Men` `MedianSalaryWomen/Men`
#   <fct>                     <dbl>                   <dbl>
# 1 Dep1                      0.769                   0.769
# 2 Dep2                      1.27                    1.27 
# 3 Dep3                      0.800                   0.800

答案 1 :(得分:2)

通过{{1}将其格式化为

,可以选择此选项
spread

答案 2 :(得分:2)

如果您希望最终得到一个每个部门有一行的表,并且包含您在此过程中计算的所有描述性统计信息,则可能需要转换为long,将某些列联合起来用作键,返回宽,然后添加您的比率。有点像...

Table <- x %>%
  group_by(Department, Gender) %>%
  summarise(Count = n(),
            AverageSalary = mean(Salary, na.rm = TRUE),
            MedianSalary = median(Salary, na.rm = TRUE)) %>%
  # convert to long form
  gather(Quantity, Value, -Department, -Gender) %>%
  # create a unified gender/measure column to use as the key in the next step 
  unite(Set, Gender, Quantity) %>%
  # go back to wide, now with repeating columns by gender
  spread(Set, Value) %>%
  # compute the department-level quantities you want using those new cols
  mutate(AverageSalaryWomenMen = F_AverageSalary/M_AverageSalary,
         MedianSalaryWomenMen = F_MedianSalary/M_MedianSalary)