我有一个包含大约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增加两列。 再次感谢!
答案 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)