R中获取列最大值与列名并按条件匹配其他列的实现方法
简洁实现方案
核心思路是先统一计算每行最终要提取的后缀(1或2),所有后续取值、列名生成都复用这个后缀变量,无需重复写判断逻辑,代码如下:
首先加载依赖包:
library(dplyr)
示例数据保持你原有写法不变,处理逻辑:
dat <- dat %>% # 统一计算每行需要使用的后缀 mutate(suf = case_when( A_1 > A_2 ~ 1, A_2 > A_1 ~ 2, # A列相等时走B列的比较逻辑 TRUE ~ max.col(cbind(B_1, B_2), "first") )) %>% # 生成A列的最大值和对应列名 mutate( max_A_val = pmax(A_1, A_2), max_A_name = paste0("A_", suf) ) %>% # 批量生成其他前缀的列名和取值,有更多前缀直接在c()里加即可 mutate(across(c(B), list( name = ~paste0(cur_column(), "_", suf), val = ~get(paste0(cur_column(), "_", suf)) ), .names = "{.col}_{.fn}")) %>% # 不需要保留后缀字段可以删除 select(-suf)
代码优势
- 逻辑集中:所有比较规则都在
suf字段的计算逻辑里,后续要扩展规则(比如A、B都相等时再比较C列),只需要修改case_when里的判断条件即可 - 可扩展性强:如果有C、D、E等更多前缀的列需要提取,只需要在
across的第一个参数c(B)里新增对应前缀,不需要重复编写ifelse逻辑 - 结果和你原有代码输出完全一致,满足需求
内容的提问来源于stack exchange,提问作者mgtrek
相关产品推荐
相关产品推荐

