R语言如何按递增序列规则替换数据框各列的NA缺失值
解法1:基础R实现
首先加载样本数据:
df <- structure(list(`Col A` = c(11, 12, 13, 14, 15), `Col B` = c(NA, 11, 12, 13, 14), `Col C` = c(NA, NA, 11, 12, 13), `Col D` = c(NA, NA, NA, 11, 12)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))
如果列数少可以直接逐列替换:
# 替换Col B的1个NA为15 df$`Col B`[is.na(df$`Col B`)] <- 15 # 替换Col C的2个NA为14、15 df$`Col C`[is.na(df$`Col C`)] <- c(14,15) # 替换Col D的3个NA为13、14、15 df$`Col D`[is.na(df$`Col D`)] <- c(13,14,15)
如果后续扩展列数,可以用通用循环批量处理,不需要手动调整每列逻辑:
# 从第二列(Col B)开始批量处理所有列 for (col_idx in 2:ncol(df)) { na_pos <- is.na(df[[col_idx]]) na_count <- sum(na_pos) # 自动生成对应长度的递增填充序列 df[[col_idx]][na_pos] <- seq(from = 15 - na_count + 1, to = 15) }
解法2:tidyverse实现
用dplyr语法代码更简洁易读:
library(dplyr) df_result <- df %>% mutate( `Col B` = replace_na(`Col B`, 15), `Col C` = replace_na(`Col C`, c(14,15)), `Col D` = replace_na(`Col D`, c(13,14,15)) )
批量处理通用写法:
library(dplyr) library(purrr) df_result <- df %>% # 跳过第一列Col A,处理后面所有列 modify_at(-1, ~{ na_cnt <- sum(is.na(.x)) replace_na(.x, seq(15 - na_cnt + 1, 15)) })
两种方法得到的最终结果一致,符合要求:
| Col A | Col B | Col C | Col D |
|---|---|---|---|
| 11 | 15 | 14 | 13 |
| 12 | 11 | 15 | 14 |
| 13 | 12 | 11 | 15 |
| 14 | 13 | 12 | 11 |
| 15 | 14 | 13 | 12 |
内容的提问来源于stack exchange,提问作者Kamakshi Bagga
相关产品推荐
相关产品推荐

