基于tidyverse的单周期LOCF实现需求(R语言)
Tidyverse实现仅填充连续NA段的首个NA(忽略开头NA)
简洁dplyr实现
library(dplyr) x <- c(NA, 3, 4, 5, 6, NA, NA, NA, 7, 8, 9 ,10, NA, NA, NA, 11, NA, 13) goal <- c(NA, 3, 4, 5, 6, 6, NA, NA, 7, 8, 9 ,10, 10, NA, NA, 11, 11, 13) # 核心逻辑:仅替换紧跟非NA值后的第一个NA filled_x <- ifelse( is.na(x) & !is.na(lag(x)), # 定位需要替换的NA:连续NA段的首个且非开头NA lag(x), # 用前一个非NA值填充 x # 其余值保持原样 ) # 验证结果匹配度 all.equal(filled_x, goal) #> [1] TRUE
数据框场景的tidyverse完整流程
如果是在数据框中处理列,可以结合tibble和mutate:
library(tidyverse) df <- tibble(original = x) %>% mutate( filled = case_when( is.na(original) & !is.na(lag(original)) ~ lag(original), TRUE ~ original ) ) # 查看处理后结果 df$filled #> [1] NA 3 4 5 6 6 NA NA 7 8 9 10 10 NA NA 11 11 13
逻辑说明
核心是精准定位需要替换的NA:
is.na(x)标记所有NA位置!is.na(lag(x))筛选出前一个位置是非NA的情况- 两者取交集,刚好对应连续NA段的第一个NA,且自动忽略开头的连续NA(开头NA的前一个值也是NA,不会触发替换)
内容的提问来源于stack exchange,提问作者CG_2
相关产品推荐
相关产品推荐

