根据另一个变量的级别生成分位数

时间:2014-03-12 15:03:55

标签: r

我有一份雇主和雇员的数据集。每个员工都有工资。 使用汇总函数,我能够通过雇主汇总工资总额,以获得每个雇主的工资总额的单点估算。 现在,我想展示每个雇主的收入分配,从而想要制作百分位数。

我编写了这段代码,它产生了整体数据的百分位数。我想要每个雇主的百分位数

pct <- quantile(salary, c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)

然后我再次尝试聚合,但R不喜欢这个

aggregate (pct, by = list(employer), FUN=length)

说实话,我不知道在这里分配什么。我只是选择了长度。

我已经阅读了这个问题的结果 Quantiles by factor levels in R 但编程超出了我的理解

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用tapply函数计算分位数:

# Making sample data...
set.seed(144)
dat <- data.frame(employer=c(rep("A", 100), rep("B", 100)),
                  salary=rnorm(200))

# Compute salary quantiles for each employer
tapply(dat$salary, dat$employer, quantile, probs=seq(0, 1, .1))
# $A
#          0%         10%         20%         30%         40%         50%         60%         70% 
# -2.41444189 -1.40732877 -1.12317885 -0.64970145 -0.47523453 -0.09430894  0.15215525  0.35878949 
#         80%         90%        100% 
#  0.65762946  1.08900468  2.60805224 
# 
# $B
#          0%         10%         20%         30%         40%         50%         60%         70% 
# -2.94139814 -1.27564687 -0.95004621 -0.57881100 -0.31022591 -0.14494699 -0.02373928  0.50534378 
#         80%         90%        100% 
#  0.92179302  1.41398773  1.98714112 

要将其全部放入一个数据框进行输出,您可以使用相同的参数,但使用aggregate函数:

aggregate(dat$salary, list(dat$employer), quantile, probs=seq(0, 1, .1))
#   Group.1        x.0%       x.10%       x.20%       x.30%       x.40%       x.50%       x.60%       x.70%
# 1       A -2.41444189 -1.40732877 -1.12317885 -0.64970145 -0.47523453 -0.09430894  0.15215525  0.35878949
# 2       B -2.94139814 -1.27564687 -0.95004621 -0.57881100 -0.31022591 -0.14494699 -0.02373928  0.50534378
#         x.80%       x.90%      x.100%
# 1  0.65762946  1.08900468  2.60805224
# 2  0.92179302  1.41398773  1.98714112