如何基于含Proszę表头的列值条件化修改相邻行数据(R语言)
问题描述
给定如下R语言数据集:
ProszęAveryextendedname <- c("A","A","A","A","B","B","B") var2 <- c("B","B","B","B","B","B","B") var3 <- c("B","B","B","B","B","B","B") ProszęBveryextendedname <- c("A","A","A","A","B","B","B") var5 <- c("B","B","B","B","B","B","B") var6 <- c("B","B","B","B","B","B","B") df <- data.frame(ProszęAveryextendedname , var2, var3, ProszęBveryextendedname, var5, var6)
需求:当表头包含Proszę的列中某行值为'A'时,将该行的相邻列设为NA;若值为'B'则保持原数据。
方案一:基于tidyverse实现
利用dplyr的批量处理能力,定位目标列后修改其相邻列:
library(tidyverse) # 获取所有含Proszę的列的位置索引 target_cols <- grep("Proszę", names(df)) df_processed <- df %>% mutate(across(all_of(target_cols), ~{ # 获取当前处理列的索引 col_pos <- match(cur_column(), names(df)) # 遍历当前列后的2个相邻列,按条件赋值 for(adj_pos in (col_pos + 1):(col_pos + 2)){ !!sym(names(df)[adj_pos]) := ifelse(.x == "A", NA, !!sym(names(df)[adj_pos])) } .x })) print(df_processed)
方案二:基于迭代函数(purrr)实现
用purrr::walk迭代处理每个目标列及其相邻列:
library(purrr) df_processed <- df target_cols <- grep("Proszę", names(df)) # 逐个处理目标列 walk(target_cols, function(col_pos){ # 提取当前目标列的判断逻辑(是否为A) is_A <- df_processed[[col_pos]] == "A" # 定位需要修改的相邻列 adj_cols <- (col_pos + 1):(col_pos + 2) # 对相邻列批量赋值 df_processed[adj_cols] <<- map(df_processed[adj_cols], ~ifelse(is_A, NA, .x)) }) print(df_processed)
方案三:基于基础R循环实现
用基础for循环完成逻辑判断与赋值:
df_processed <- df target_cols <- grep("Proszę", names(df)) # 遍历每个目标列 for(col_pos in target_cols){ # 获取当前行是否为A的逻辑向量 is_A <- df_processed[[col_pos]] == "A" # 遍历后续相邻列,修改对应行的值 for(adj_pos in (col_pos + 1):(col_pos + 2)){ df_processed[is_A, adj_pos] <- NA } } print(df_processed)
预期输出
ProszęAveryextendedname var2 var3 ProszęBveryextendedname var5 var6 1 A NA NA A NA NA 2 A NA NA A NA NA 3 A NA NA A NA NA 4 A NA NA A NA NA 5 B B B B B B 6 B B B B B B 7 B B B B B B
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

