You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用更简洁的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:31