使用分位数在 R 中创建间隔列,然后计算平均值

Create an intervals' column in R using quantiles and compute an average after that

我有一个这样的数据集,代表合同[出于保密原因在此处发明数据]:

字段 子组 duration_days amount_per_day
72145 7214598 700 8095800.2
72145 7214598 541 5039689.1
72145 7214554 98 3801372.8
72145 7214554 900 2444928.7
90385 9038529 100 2861857.0
90385 9038529 284 1736789.4

我想获得另外 2 个列:一个关于天数间隔,基于第 33 和第 66 个分位数,另一个计算按字段和子组分组的每天平均数量。

期望输出

字段 子组 days_intervals avg_amount_per_day
72145 7214598 0-33 分位数 值 1
72145 7214598 第 33-66 分位数 值 2
72145 7214598 第 66 个分位数 -(最长合同的期限) 值 3

对于所有字段和子组依此类推,当然还有数值 1、2、3,它们是数字以及分位数的值。

当我使用以下代码时:

f <- data.frame(df %>%  dplyr::group_by(field, subgroup) %>% dplyr::summarize(quants = quantile(duration_days, probs = c(0.33, 0.66))))

我获得了一个包含 3 列的数据框:字段、子组、量化,每个分组和分位数值有 1 行(因此每次有 2 行)。

我想知道 R 是否是一个很好的工具,但如果它更容易,我可以使用 Python。

你可以求助于cut -

library(dplyr)

df %>%  
  group_by(field, subgroup) %>%
  group_by(quants = cut(duration_days, quantile(duration_days, c(0, .33, .66, 1)), 
                        labels = c('33%', '66%', '100%'), include.lowest = TRUE), .add = TRUE) %>%
  summarise(avg_amount_per_day = mean(amount_per_day, na.rm = TRUE), .groups = 'drop')