如何在R中对多个变量批量应用自定义分组差异检测函数
解决方法
首先修正原函数的参数引用问题,然后可以通过dplyr::across或者purrr::map_dfc实现批量处理多个变量的需求,以下是具体方案:
方案一:使用across直接处理(推荐)
不需要单独定义函数,直接在分组后用across遍历目标变量,结合cur_column()获取当前变量名:
library(dplyr) library(tibble) x <- c(2,4,5,5,6,2,3) y <- c(5,5,2,3,6,1,8) z <- c(5,2,4,1,3,5,1) xy <- tibble(x, y, z) # 自动筛选要检查的变量(排除分组变量x) vars_to_check <- setdiff(names(xy), "x") xy %>% group_by(x) %>% mutate(across(all_of(vars_to_check), ~if_else(n_distinct(.x) > 1, cur_column(), NA_character_))) %>% ungroup() %>% select(all_of(vars_to_check))
运行结果:
# A tibble: 7 × 2 y z <chr> <chr> 1 y NA 2 NA NA 3 y z 4 y z 5 NA NA 6 y NA 7 NA NA
方案二:封装函数后用map_dfc批量调用
如果需要保留自定义函数的形式,可以先修正函数逻辑,再用map_dfc遍历变量:
library(dplyr) library(tibble) library(purrr) x <- c(2,4,5,5,6,2,3) y <- c(5,5,2,3,6,1,8) z <- c(5,2,4,1,3,5,1) xy <- tibble(x, y, z) # 修正后的diff_var函数,处理单个变量 diff_var <- function(data, var_name) { data %>% group_by(x) %>% mutate(!!var_name := if_else(n_distinct(.data[[var_name]]) > 1, var_name, NA_character_)) %>% ungroup() %>% pull(var_name) } # 批量处理目标变量 vars_to_check <- setdiff(names(xy), "x") map_dfc(vars_to_check, ~diff_var(xy, .x)) %>% set_names(vars_to_check)
该方案同样能得到符合预期的输出。
原函数的问题说明
你原函数存在参数引用错误:函数定义为diff_var(a, b),但内部使用了未定义的{{c}},应替换为{{b}};同时原函数逻辑冗余,无需先transmute再ungroup后imap_dfc,直接在分组内判断n_distinct即可完成需求。
内容的提问来源于stack exchange,提问作者Abigail
相关产品推荐
相关产品推荐

