R语言基于tidyverse实现成对列缺失值同步的无循环高效方案
实现方案(基于tidyverse生态,无显式循环)
以下两种方案均为向量化实现,执行效率远高于嵌套for循环,逻辑清晰易维护:
方案1:宽表直接处理(适合固定12对变量的场景)
核心思路是遍历1-12的序号,同步处理每对A、B列的缺失值同步:
library(tidyverse) df_result <- df %>% mutate( !!!map(1:12, \(n) { a_col <- sym(paste0("A", n)) b_col <- sym(paste0("B", n)) list( !!a_col := if_else(is.na(!!a_col) | is.na(!!b_col), NA_real_, !!a_col), !!b_col := if_else(is.na(!!a_col) | is.na(!!b_col), NA_real_, !!b_col) ) }) )
注:如果A、B列是字符型,把NA_real_替换为NA_character_即可,也可以直接用base R的ifelse自动适配类型
方案2:长表转换处理(适配性更强,变量对数变动无需改核心逻辑)
核心思路是把宽表转为成对的长表结构,统一处理缺失值后再转回原宽表结构:
df_result <- df %>% pivot_longer( cols = -ID, names_to = c(".value", "pair_idx"), names_pattern = "^([AB])(\\d+)$" ) %>% mutate( across(c(A, B), ~ if_else(is.na(A) | is.na(B), NA, .x)) ) %>% pivot_wider( names_from = pair_idx, values_from = c(A, B), names_sep = "" ) %>% select(ID, all_of(paste0("A", 1:12)), all_of(paste0("B", 1:12)))
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

