R中如何将dataframe列的NA值向下填充到最后一个有效值位置
R 实现方法
tidyverse 方案(推荐,代码简洁)
首先加载依赖包:
library(dplyr) library(tidyr)
核心处理代码:
df_result <- df %>% mutate(across(-d, function(col) { # 定位当前列最后一个非NA值的行号 last_valid_pos <- max(which(!is.na(col))) # 仅对首行到最后一个有效值的区间做向下填充 col[1:last_valid_pos] <- fill( data.frame(tmp = col[1:last_valid_pos]), tmp )$tmp return(col) }))
纯 base R 方案(无需加载第三方包)
# 遍历除首列外的所有列 for (col in names(df)[-1]) { current_col <- df[[col]] last_valid_pos <- max(which(!is.na(current_col))) fill_val <- NA # 仅填充到最后一个有效值所在行 for (i in seq_len(last_valid_pos)) { if (!is.na(current_col[i])) { fill_val <- current_col[i] } else { current_col[i] <- fill_val } } df[[col]] <- current_col }
逻辑说明
- 用
max(which(!is.na(col)))获取列最后一个非NA值的位置,相比你之前写的rev(which(df$b>0))[1]兼容性更强,不会漏掉列值为0、负数的合法场景 - 仅对「首行到最后一个有效值位置」的区间做向下填充,区间外的NA会原样保留,完全匹配你的需求
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

