You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何分摊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)

关键逻辑解释

  1. 辅助列作用:
    • curr_q:提取当前记录的季度编号(1-4),快速识别第三季度行。
    • next_x/next_q:获取下一行的x值和季度,验证下一季度是否为Q4且x>0。
  2. case_when规则:
    • 第一条规则精准匹配需要处理的Q3行,直接将下季度值的一半赋值给当前行。
    • 第二条规则匹配对应Q4行,通过lead()反向关联上一行的条件,将自身值减半。
    • 所有不满足条件的记录,x值保持原始状态。
  3. 最后通过select清理临时辅助列,得到结构整洁的处理后数据集。

内容的提问来源于stack exchange,提问作者BqKaXeu29y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:40:13