R数据框操作:将b、d列NA值左侧的所有值替换为NA
实现方法
你可以选择基础R或者tidyverse方案实现需求,两种方案都可以直接运行得到目标结果:
1. 基础R实现
# 原数据 df <- data.frame(a = c(1,2,3,4), b = c(NA,1,NA,1), c = c(1,4,5,2), d = c(1,NA,NA,1)) # 指定需要判断NA的标记列 cols_mark <- c("b", "d") idx_mark <- match(cols_mark, names(df)) n_col <- ncol(df) # 逐行处理 for (i in seq_len(nrow(df))) { na_mark_pos <- idx_mark[is.na(df[i, idx_mark])] if (length(na_mark_pos) == 0) next max_na_pos <- max(na_mark_pos) non_na_mark_pos <- idx_mark[!is.na(df[i, idx_mark])] left_bound <- if (length(non_na_mark_pos) == 0) 0 else max(non_na_mark_pos[non_na_mark_pos < max_na_pos]) df[i, which(seq_len(n_col) > left_bound & seq_len(n_col) < max_na_pos)] <- NA } # 查看结果 df
运行后输出:
a b c d 1 NA NA 1 1 2 2 1 NA NA 3 NA NA NA NA 4 4 1 2 1
2. tidyverse 实现
如果你习惯用dplyr/purrr的语法,可以用如下方案:
library(dplyr) library(purrr) df <- data.frame(a = c(1,2,3,4), b = c(NA,1,NA,1), c = c(1,4,5,2), d = c(1,NA,NA,1)) idx_mark <- match(c("b", "d"), names(df)) n_col <- ncol(df) df <- df %>% pmap_dfr(function(...) { row <- c(...) na_mark_pos <- idx_mark[is.na(row[idx_mark])] if (length(na_mark_pos) == 0) return(row) max_na_pos <- max(na_mark_pos) non_na_mark_pos <- idx_mark[!is.na(row[idx_mark])] left_bound <- if (length(non_na_mark_pos) == 0) 0 else max(non_na_mark_pos[non_na_mark_pos < max_na_pos]) row[seq_len(n_col) > left_bound & seq_len(n_col) < max_na_pos] <- NA return(row) }) # 查看结果 df
内容的提问来源于stack exchange,提问作者Pajul
相关产品推荐
相关产品推荐

