如何使用dplyr将数据框所有列名改为标题大小写形式?
解决数据框列名重命名:将蛇形命名转为每个单词首字母大写且保留下划线的格式
问题场景
需要将数据框列名从蛇形命名(如first_name、last_name)转为每个单词首字母大写、下划线保留的格式(First_Name、Last_Name),但使用str_to_title()只能实现首单词首字母大写(得到First_name这类不符合预期的结果)。
测试代码:
library(dplyr) df <- tribble( ~'first_name', ~'last_name', ~'age', "John", "Kambusa", 45, "Jane", "kumbuka", 40, ) # 结果不符合预期:得到First_name、Last_name df |> rename_with(~str_to_title(.x))
可行解决方案
方案1:正则表达式替换
利用stringr的正则匹配,先统一处理首字母,再将下划线后的小写字母转为大写:
library(dplyr) library(stringr) df_renamed <- df |> rename_with(~ str_replace_all(str_to_title(.x), "_([a-z])", "_\\U\\1", perl = TRUE)) # 查看列名结果 colnames(df_renamed) # [1] "First_Name" "Last_Name" "Age"
- 逻辑:
str_to_title()先将每个列名的第一个单词首字母大写,再通过正则_([a-z])匹配下划线后的小写字母,用\\U\\1将捕获到的字母转为大写(需开启perl = TRUE支持该语法)。
方案2:拆分-处理-合并
将列名按下划线拆分,对每个部分单独首字母大写后重新合并:
library(dplyr) library(stringr) df_renamed <- df |> rename_with(~ { # 拆分列名为单词向量 name_parts <- str_split(.x, "_")[[1]] # 每个单词首字母大写 name_parts <- str_to_title(name_parts) # 用下划线合并 paste(name_parts, collapse = "_") }) colnames(df_renamed) # [1] "First_Name" "Last_Name" "Age"
- 逻辑:拆分后逐个处理每个单词的大小写,再合并,避免正则的语法依赖,逻辑更直观。
方案3:使用snakecase包(推荐)
snakecase包专门用于命名格式转换,一行代码即可实现需求:
# 先安装包(首次使用时) install.packages("snakecase") library(snakecase) library(dplyr) df_renamed <- df |> rename_with(~ to_mixed_case(.x, sep_in = "_", sep_out = "_", upper_case = "all")) colnames(df_renamed) # [1] "First_Name" "Last_Name" "Age"
- 逻辑:
to_mixed_case()参数说明:sep_in = "_":输入是下划线分隔的蛇形命名sep_out = "_":输出保留下划线分隔upper_case = "all":每个单词的首字母都大写
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

