如何分摊R数据集第三季度的零值?基于下一季度非零值的处理
季度数据分摊处理方案
问题说明
给定包含季度时间序列的数据集(部分x值被设为0),需求如下:
当某条记录是**第三季度(Q3)**且
x=0,同时下一季度(Q4)的x>0时,将Q4的x值平均分摊到Q3和Q4;若Q4的x≤0,则不执行任何操作。
数据集生成代码:
library(tibble) library(lubridate) set.seed(1234) df <- tibble( date = seq(ymd("2000-01-1"), ymd("2020-12-1"), by = "quarter"), x = rnorm(84, mean = 6000, sd = 5000) ) df$x[sample(nrow(df), 20)] <- 0
解决方案代码
我们可以使用dplyr包配合时间序列判断来实现需求,代码如下:
library(dplyr) df_processed <- df %>% # 添加辅助列用于条件判断 mutate( curr_q = quarter(date), next_x = lead(x), next_q = lead(curr_q) ) %>% # 按规则修改x值 mutate( x = case_when( # 处理符合条件的Q3行:将下季度值的一半赋值给当前行 curr_q == 3 & x == 0 & next_q == 4 & next_x > 0 ~ next_x / 2, # 处理对应Q4行:将自身值减半 lead(curr_q == 3 & x == 0 & next_q == 4 & next_x > 0, default = FALSE) ~ x / 2, # 其他情况保留原x值 TRUE ~ x ) ) %>% # 移除临时辅助列 select(-curr_q, -next_x, -next_q)
关键逻辑解释
- 辅助列作用:
curr_q:提取当前记录的季度编号(1-4),快速识别第三季度行。next_x/next_q:获取下一行的x值和季度,验证下一季度是否为Q4且x>0。
case_when规则:- 第一条规则精准匹配需要处理的Q3行,直接将下季度值的一半赋值给当前行。
- 第二条规则匹配对应Q4行,通过
lead()反向关联上一行的条件,将自身值减半。 - 所有不满足条件的记录,
x值保持原始状态。
- 最后通过
select清理临时辅助列,得到结构整洁的处理后数据集。
内容的提问来源于stack exchange,提问作者BqKaXeu29y
相关产品推荐
相关产品推荐

