如何按指定规则重命名R语言中因子(factor)的水平?
按指定规则重命名因子水平的实现方案
需求说明
需要对因子水平应用以下重命名规则:
- 若因子水平的字符长度≥3:转换为句首大写格式(sentence case)(仅首个单词首字母大写,其余小写)
- 若因子水平的字符长度<3:转换为标题大小写格式(title case)(每个单词首字母大写)
示例:
home doing nothing→Home doing nothingyes→Yesgood practice→Good practice(若需多单词全首字母大写,可参考下文补充调整)
实现代码
通过自定义函数结合fct_relabel即可实现规则,具体代码如下:
library(tidyverse) # 定义根据长度判断的重命名函数 rename_factor_levels <- function(x) { if (nchar(x) >= 3) { str_to_sentence(x) # 长度≥3时用句首大写 } else { str_to_title(x) # 长度<3时用标题大小写 } } # 加载并预处理原始数据 vars <- c("a", "b", "c", "d", "e") mydata <- tribble( ~"a", ~"b", ~"c", ~"d", ~"e", ~"id", "yes", "school in Kenya", "r", 10, "good practice", 1, "no", "home doing nothing", "python", 12, "doing well", 3, "no", "school in Tanzania", "c++", 35, "by walking", 4, "yes", "home practising", "c", 65, "practising everyday", 5, "no", "home", "java", 78, "sitting alone", 7 ) %>% mutate(across(.cols = vars, ~as_factor(.))) # 对所有因子列应用重命名规则 mydata_renamed <- mydata %>% mutate(across(where(is.factor), ~fct_relabel(., rename_factor_levels)))
结果验证
查看处理后各因子列的水平:
# 列a的水平("yes"、"no"长度为3,转为句首大写) levels(mydata_renamed$a) #> [1] "Yes" "No" # 列b的水平(所有水平长度≥3,转为句首大写) levels(mydata_renamed$b) #> [1] "School in kenya" "Home doing nothing" "School in tanzania" #> [4] "Home practising" "Home" # 列c的水平("r"、"c"长度<3,转为标题大小写;其余长度≥3转为句首大写) levels(mydata_renamed$c) #> [1] "R" "Python" "C++" "C" "Java"
补充调整(匹配示例中的多单词标题格式)
若需要让多单词的因子水平(如good practice)转换为每个单词首字母大写的标题格式,可修改自定义函数,增加单词数量的判断:
rename_factor_levels <- function(x) { # 多单词时用标题大小写 if (str_count(x, "\\w+") > 1) { str_to_title(x) } # 单个单词且长度≥3时用句首大写 else if (nchar(x) >= 3) { str_to_sentence(x) } # 单个单词且长度<3时用标题大小写 else { str_to_title(x) } }
此时good practice会转换为Good Practice,完全匹配示例要求。
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

