【问题标题】:R quantile equal sized bucket after summarizing to the buckets汇总到桶后的R分位数相等大小的桶
【发布时间】:2018-04-21 03:49:47
【问题描述】:

如何使每个组在求和后大小相等?

以下是将数量分成 10 组的示例,每组的商品数量相同。

    set.seed(42)
    quantity <- c(runif(100, 0, 100))
    dat <- data.frame(
      qty = quantity,
      qtile = cut(quantity, quantile(quantity, seq(0, 1, 0.1)), 
      include.lowest = TRUE))
    dat <- dat %>% group_by(qtile) %>% summarise(qty = sum(qty))
    ggplot(dat, aes(qtile, qty)) + geom_bar(stat = 'identity')

但是我如何对组进行排序,以便在summarise 步骤中,qty 变量在组中大致相等?

所以在这个例子中,qty 的总数是5244.787,每个组在summarise 之后会有524.4787

【问题讨论】:

  • dplyr 有一个cut_number 函数。来自文档:“cut_number 使 n 组具有(大约)相同数量的观察”
  • @camille,我不是在寻找相同数量的观察组。我正在按组寻找大致相等的总和。有关示例,请参见我的答案。还是谢谢你!

标签: r


【解决方案1】:

这是我所能达到的。我觉得它大致适用于我的用例。如果其他人有改进的好主意,请随时更新答案。

set.seed(42)
quantity <- c(runif(100, 0, 100))

dat <- data.table(
  qty = quantity,
  wt = quantity
)
dat[!is.na(qty), avg := sum(wt) / 10]
setorder(dat, qty, wt)
dat[!is.na(qty), cum_wt := cumsum(wt)]
dat[!is.na(qty), level := cum_wt / avg]
dat[!is.na(qty), qtile := ceiling(level)]

dat <- dat[, .(qty = sum(qty)), by = 'qtile']

ggplot(dat, aes(qtile, qty)) + geom_bar(stat = 'identity')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多