时间序列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的所有列,对每一列单独处理- 条件判断逐一验证需求:
- 当前值为0
- 前后相邻值均存在(非NA)
- 前后相邻值均不为0(确保是孤立零值)
- 前后相邻值均大于2
- 满足所有条件时,用前后值的平均值完成插值;不满足则保留原数值
运行代码后,仅person1的year2位置零值被替换为20.5,其余零值因不满足条件保持不变,与期望结果一致。
内容的提问来源于stack exchange,提问作者Dove_pigeon
相关产品推荐
相关产品推荐

