特定时间段排除最大值的DataFrame衍生指标计算需求
解决你的DataFrame计算需求
我来帮你一步步实现需要的df_delta DataFrame!咱们用dplyr(tidyverse工具集的一部分)来高效处理这些计算,逻辑清晰又容易理解。
步骤1:准备工作(按需处理)
首先确保你的DATE列是可用于时间比较的日期类型。如果原始数据里DATE是字符串格式(比如"01.12.2019"),先用lubridate包转换:
library(dplyr) library(lubridate) # 转换日期列(如果原始是字符串格式) df$DATE <- dmy(df$DATE)
你提供的头部数据已经是POSIXct类型,这一步可以跳过,但保留下来方便其他类似场景参考。
步骤2:定义目标时间段
明确我们要筛选的时间范围:2019年11月1日至2020年3月1日:
start_date <- ymd("2019-11-01") end_date <- ymd("2020-03-01")
步骤3:计算核心汇总值
按ARTNR分组,计算每个商品的总金额、记录数,以及指定时间段内的最大金额:
df_summary <- df %>% group_by(ARTNR) %>% summarize( sum_1 = sum(AMOUNT), # 每个ARTNR的AMOUNT总和 n = n(), # 每个ARTNR的记录总数 # 计算指定时间段内的AMOUNT最大值,na.rm=TRUE处理无数据的特殊情况 max_amount = max(AMOUNT[DATE >= start_date & DATE < end_date], na.rm = TRUE) )
步骤4:计算衍生字段并生成df_delta
基于汇总值计算你需要的sum_minus_max、average和delta字段,最后整理成目标结构:
df_delta <- df_summary %>% mutate( sum_minus_max = sum_1 - max_amount, # 总和减去时间段内最大值 average = sum_minus_max / (n - 1), # 剩余金额的平均值(除以n-1) delta = average - max_amount # 平均值与时间段最大值的差值 ) %>% # 按你需要的顺序选择字段 select(ARTNR, sum_1, sum_minus_max, average, delta)
验证结果
运行完上面的代码后,df_delta会和你期望的结果完全一致:
| ARTNR | sum_1 | sum_minus_max | average | delta |
|---|---|---|---|---|
| 20 | 620 | 420 | 140.00 | -60.00 |
| 12 | 420 | 320 | 106.67 | 6.67 |
如果需要调整小数位数,可以用round()函数,比如average = round(sum_minus_max / (n - 1), 2)。
内容的提问来源于stack exchange,提问作者Yaron Nolan
相关产品推荐
相关产品推荐

