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

时间序列DataFrame特定零值插值:仅满足单零值及邻值条件

时间序列DataFrame中满足特定条件的零值插值实现

我们需要对时间序列DataFrame中的零值进行插值,但仅在同时满足以下两个条件时执行:

  • 该零值为孤立的单个零,其前后相邻的数值均不为零
  • 前后的非零数值均大于2

原始数据与代码

原始数据构造代码:

df = data.frame(row.names = c("year 1", "year 2", "year 3", "year 4", "year 5"), 
     person1 = c(33,0,8,6,3), person2 = c(1,3,0,0,5), person3 = c(0,3,0,5,1))

原始数据输出:

person1 person2 person3
year 1      33       1       0
year 2       0       3       3
year 3       8       0       0
year 4       6       0       2
year 5       3       5       1

期望结果:

person1 person2 person3
year 1      33       1       0
year 2     *20.5*    3       3
year 3       8       0       0
year 4       6       0       2
year 5       3       5       1

解决方案代码

可以借助dplyr包的lead()和lag()函数精准判断满足条件的零值,再进行插值计算。代码如下:

library(dplyr)

# 对每一列执行条件判断与插值
df_processed <- df %>%
  mutate(across(everything(), ~ ifelse(
    .x == 0 & !is.na(lag(.x)) & !is.na(lead(.x)) & 
      lag(.x) != 0 & lead(.x) != 0 & lag(.x) > 2 & lead(.x) > 2,
    (lag(.x) + lead(.x)) / 2,
    .x
  )))

# 输出处理后的数据
print(df_processed)

代码逻辑说明

  • across(everything()):遍历DataFrame的所有列,对每一列单独处理
  • 条件判断逐一验证需求:
    1. 当前值为0
    2. 前后相邻值均存在(非NA)
    3. 前后相邻值均不为0(确保是孤立零值)
    4. 前后相邻值均大于2
  • 满足所有条件时,用前后值的平均值完成插值;不满足则保留原数值

运行代码后,仅person1的year2位置零值被替换为20.5,其余零值因不满足条件保持不变,与期望结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:52:39