如何结合dplyr的mutate、across与stringr函数移除列名前缀?
解决方法:批量移除列名的
n_/v_前缀 嗨,你的思路方向没错,但有个小误区:across()是用来处理列中的数值/文本内容的,而你要修改的是列名,所以得换用专门的重命名工具~ 下面给你两种简洁高效的实现方式:
方法1:用dplyr的rename_with()(推荐,符合tidyverse风格)
rename_with()是dplyr专门用来批量重命名列的函数,完美适配你的需求:
library(tidyverse) set.seed(1) mockup <- tibble(n_col1 = sample(1:10, 5, FALSE), v_col2 = sample(letters, 5, FALSE), col3 = sample(10:20, 5, TRUE), col4 = sample(LETTERS, 5, FALSE)) # 批量移除n_或v_前缀 mockup_cleaned <- mockup %>% # 第一个参数是重命名逻辑,第二个参数是要处理的列 rename_with( ~ str_remove(., "^(n_|v_)"), # 正则匹配开头的n_或v_并移除 starts_with(c("n_", "v_")) # 筛选需要处理的列 ) # 查看处理后的列名 colnames(mockup_cleaned) #> [1] "col1" "col2" "col3" "col4"
方法2:直接修改colnames()(更简洁,无需dplyr管道)
如果你觉得管道没必要,也可以直接操作列名向量:
# 直接替换所有列名中的前缀 colnames(mockup) <- str_remove(colnames(mockup), "^(n_|v_)") # 验证结果 colnames(mockup) #> [1] "col1" "col2" "col3" "col4"
为什么你的原代码没生效?
你之前用mutate(across(...))是在对列里的每个元素应用str_remove,但你的n_col1是整数类型,str_remove无法处理数值,所以会报错或得到不符合预期的结果——这完全不是修改列名的正确姿势哦~
内容的提问来源于stack exchange,提问作者Darius




