使用分位数在 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')
我有一个这样的数据集,代表合同[出于保密原因在此处发明数据]:
字段 | 子组 | 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')