【问题标题】:pivot table with weighted medians [duplicate]具有加权中位数的数据透视表[重复]
【发布时间】:2016-02-29 05:51:54
【问题描述】:

这个任务看起来很简单,但我还是找不到答案。我在数据透视表中看到了加权平均值(即平均值)的解决方案,但没有看到加权中位数。

我需要创建一个带有加权中位数的数据透视表(使用两列,一列带有值,一列带有权重——每个值的数量要针对中位数计算)。换句话说……

city           value    weight
Phoenix        100      40
Phoenix        140      12
Phoenix        500      15
San Francisco  700      5
San Francisco  300      5
San Francisco  350      1
San Francisco  600      1

会回来的……

city           weighted median
Phoenix        100
San Francisco  475

我一直试图在 PostgreSQL 和 R 中找到合适的解决方案,但到目前为止还没有运气。任何帮助表示赞赏!

【问题讨论】:

    标签: r postgresql pivot-table median


    【解决方案1】:

    在 R 中,你可以试试这个:

    require("plyr")
    
    > ddply(df, ~city, summarise, median=median(rep(value, weight)))
               city median
    1       Phoenix    100
    2 San Francisco    475
    

    数据:

    df <- data.frame(city=c("Phoenix", "Phoenix", "Phoenix",
                            "San Francisco", "San Francisco", "San Francisco", "San Francisco"),
                     value=c(100, 140, 500, 700, 300, 350, 600),
                     weight=c(40, 12, 15, 5, 5, 1, 1))
    

    请查看this SO article,了解有关在 R 中计算加权中位数的更多信息。

    【讨论】:

    • 谢谢蒂姆。这似乎应该有效,但我不断收到Error: invalid 'times' argument 消息。不熟悉这个包。值和权重都是整数。
    • 我更新了,请重试。
    • 同样的错误信息——它当然适用于您创建的数据框,所以是否有可能空值将其丢弃?
    • 我相信你的数据集有问题,但我不知道是什么问题。如果它真的看起来像您的 OP 中的示例,则应该没有错误。
    • 只需要删除空值。谢谢蒂姆!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多