如何用更简洁的dplyr方法提取字符串首尾字符生成新变量?
嗨,我来帮你梳理下更简洁的dplyr实现方式,还有自定义函数的写法~
更简洁的dplyr一步实现
你原来的方法需要先拆分再合并,其实可以直接在mutate里完成首尾字符的提取+拼接,省去unite的步骤,而且用负索引取最后一个字符会更通用(不用硬编码固定位置7,就算字符串长度变化也能正常工作):
library(dplyr) library(stringr) df <- tibble(code = c("B12345A", "B12345C")) # 一步生成code_2 df <- df %>% mutate(code_2 = str_c(str_sub(code, 1, 1), str_sub(code, -1, -1)))
这里str_sub(code, -1, -1)表示取字符串的最后一个字符,比写固定的7更灵活,适配不同长度的code值。
自定义函数的实现
如果这个提取首尾字符的逻辑你会多次用到,写个自定义函数会让代码更清晰、易维护。
基础版自定义函数
先写一个专门提取首尾各1个字符并拼接的函数:
# 自定义函数:提取字符串首尾字符并拼接 get_first_last <- function(str_vec) { str_c(str_sub(str_vec, 1, 1), str_sub(str_vec, -1, -1)) } # 在dplyr中调用 df <- df %>% mutate(code_2 = get_first_last(code))
灵活版自定义函数
如果想让函数适配更多场景(比如提取前n个和后m个字符),可以给函数加参数:
# 更灵活的函数:可指定提取前n个、后m个字符 get_start_end <- function(str_vec, n = 1, m = 1) { str_c(str_sub(str_vec, 1, n), str_sub(str_vec, -m, -m)) } # 默认提取首尾各1个字符 df <- df %>% mutate(code_2 = get_start_end(code)) # 示例:提取前2个和后2个字符 # df <- df %>% mutate(code_2 = get_start_end(code, n=2, m=2))
这样后续如果需求变化,只需要修改函数内部或者调用时的参数就行,不用到处改代码。
内容的提问来源于stack exchange,提问作者user7542670
相关产品推荐
相关产品推荐

