【问题标题】:Produce quantiles based on levels of another variable根据另一个变量的水平产生分位数
【发布时间】:2014-03-12 15:03:54
【问题描述】:

我有一个包含雇主和雇员的数据集。每个员工都有分配的工资。 使用聚合函数,我能够按雇主汇总总工资,以获得每个雇主总工资的单点估计。 现在,我想展示每个雇主的收入分配情况,因此想要制作百分位数。

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

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)

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

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

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

    • 谢谢。我收到一条关于 NaN 的错误消息,但我添加了语句 na.rm=TRUE 是结尾,它现在可以工作了
    • 现在我需要将输出导出到excel。以下代码不起作用 write.table(tapply(dat$salary, dat$employer, quantile, probs=seq(0,1,0.1), na.rm=TRUE), file="example.csv")
    • 您的write.table 代码不起作用的原因是tapply 正在返回一个列表,但write.table 不接受列表。在tapply 调用之后使用$A$B,您可以提取tapply 输出的这些部分并导出它们。
    • 谢谢。我假设 $A 和 $B 是对输出的引用?在我的情况下,$A 将是雇主 A 的百分位数,而 $B 将是雇主 B 的百分位数等等?我在这里遇到的问题是,我的数据集中有近 2000 个雇主,所以如果不输入 $ 命令并列出每个人,我不确定这是如何工作的
    • @Nottles82 我已更新为包含aggregate,它将为您的所有组返回一个数据框。
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2020-05-24
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多