如何基于单一条件同时mutate多个R DataFrame列?
基于单一条件批量执行mutate的实现方法
可以实现,以下是几种无需重复书写判断条件的简洁方案:
方法1:临时条件列(最直观易读)
先将判断条件存为临时列,基于该列生成目标列后自动移除临时列,条件仅需定义一次:
library(dplyr) df <- data.frame(x=1:10) df %>% mutate( is_over_3 = x > 3, y = if_else(is_over_3, "Y", "N"), z = if_else(is_over_3, "YY", "NN"), .keep = "unused" # 自动删除临时的is_over_3列 )
方法2:结合across与cur_column()
利用across遍历目标列,通过cur_column()识别当前处理的列,匹配对应结果,条件仅写一次:
df %>% mutate( across( .cols = c(y, z), .fns = ~ if_else( x > 3, if_else(cur_column() == "y", "Y", "YY"), if_else(cur_column() == "y", "N", "NN") ), .names = "{.col}" ) )
方法3:结合purrr映射函数
先定义各列的结果映射关系,通过map_dfc一次性生成所有目标列,条件仅需调用一次:
library(dplyr) library(purrr) df <- data.frame(x=1:10) # 定义映射:每个元素的第一个值是条件不满足时的结果,第二个是满足时的结果 result_map <- list(y = c("N", "Y"), z = c("NN", "YY")) df %>% bind_cols( map_dfc(result_map, ~ if_else(x > 3, .x[2], .x[1])) )
内容的提问来源于stack exchange,提问作者HappyPy
相关产品推荐
相关产品推荐

