如何在R中结合dplyr的rename_all与if_else实现指定规则列名修改
R语言rename_all结合if_else修改列名实现方案
你可以直接在rename_all中嵌套自定义逻辑完成需求,以下是两种常用写法:
写法1:链式操作合并逻辑(推荐)
dplyr 1.0及以上版本推荐使用purrr风格的公式写法替代已废弃的funs(),代码更简洁易读:
library(dplyr) df <- data.frame(gh225 = "foo1", gh765 = "foo2", gauskper = "foo3") %>% rename_all(~{ # 先完成gh替换为v的逻辑 col_name <- stringr::str_replace_all(.x, "gh", "v") # 再按规则匹配替换列名 dplyr::if_else(stringr::str_detect(col_name, "au"), "id_per", col_name) })
写法2:分步操作(逻辑更清晰)
如果需要拆分两个修改规则方便后续调试,可以拆分两次rename_all调用:
library(dplyr) df <- data.frame(gh225 = "foo1", gh765 = "foo2", gauskper = "foo3") %>% # 第一步:替换所有列名中的gh为v rename_all(~stringr::str_replace_all(.x, "gh", "v")) %>% # 第二步:匹配含au的列名替换为id_per rename_all(~dplyr::if_else(stringr::str_detect(.x, "au"), "id_per", .x))
旧版本dplyr兼容写法
如果你使用的是不支持公式写法的旧版dplyr,可沿用funs()实现:
library(dplyr) df <- data.frame(gh225 = "foo1", gh765 = "foo2", gauskper = "foo3") %>% rename_all(funs( dplyr::if_else( stringr::str_detect(stringr::str_replace_all(., "gh", "v"), "au"), "id_per", stringr::str_replace_all(., "gh", "v") ) ))
以上三种写法运行后,最终得到的df列名为v225、v765、id_per,完全符合需求。
内容的提问来源于stack exchange,提问作者Paula
相关产品推荐
相关产品推荐

