R语言如何实现值1后NA.fill填充、值-1后保留NA
实现方案
1. 依赖tidyverse的简洁写法
借助分组逻辑+向下填充函数即可快速实现:
library(dplyr) library(tidyr) dat_result <- dat %>% # 每遇到非NA值就开启一个新分组,把连续的NA和它前面的第一个有效值归为同一组 mutate(group = cumsum(!is.na(Old))) %>% # 按组判断:如果组内第一个有效值是1,就向下填充所有NA;是-1则保留原值不填充 mutate( New = if_else(first(Old[!is.na(Old)]) == 1, nafill(Old, type = "locf"), Old), .by = group ) %>% select(-group)
运行后dat_result的New列完全匹配你给出的示例效果。
2. 无依赖的Base R实现
如果你不想加载第三方包,可以用基础函数实现:
last_val <- NA dat$New <- vapply(dat$Old, function(x) { if (!is.na(x)) last_val <<- x if (last_val == 1) 1 else x }, numeric(1))
这个写法性能也不错,适配你提到的「列中仅包含1和-1两类非NA取值」的前提。
内容的提问来源于stack exchange,提问作者1BuRg3R
相关产品推荐
相关产品推荐

