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

如何在R中为特定数字与字符添加连字符并重构数据列

解决方法

这里给你两种可行的实现方式,base R和tidyverse工具链都有,你可以选顺手的用:

方法一:Base R 原生函数实现

先构造个测试数据框方便验证效果:

df_t <- data.frame(row_names = c("X2012SGA007930001", "X2013TGB001230002"))

按需求分步处理:

# 直接在原数据框生成新列
df_t$Genetic <- with(df_t, {
  core_str <- sub("^X", "", row_names)  # 去掉开头的X前缀
  part1 <- substr(core_str, 1, 5)       # 提取前5位:2012S/2013T
  part2 <- substr(core_str, 6, 7)       # 提取第6-7位:GA/GB
  part3 <- substr(core_str, 8, 12)      # 提取第8-12位:00793/00123
  part4 <- substr(core_str, 13, 16)     # 提取第13-16位:0001/0002
  paste(part1, part2, part3, part4, sep = "-")
})

运行后df_t$Genetic会得到"2012S-GA-00793-0001"和"2013T-GB-00123-0002"这类目标格式的结果。

方法二:tidyverse 工具链实现

如果习惯用dplyr/tidyr的语法,可以这么写:

library(dplyr)
library(stringr)

df_t <- df_t %>%
  mutate(
    core_str = str_remove(row_names, "^X"),  # 移除前缀X
    part1 = str_sub(core_str, 1, 5),
    part2 = str_sub(core_str, 6, 7),
    part3 = str_sub(core_str, 8, 12),
    part4 = str_sub(core_str, 13, 16),
    Genetic = str_c(part1, part2, part3, part4, sep = "-")
  ) %>%
  select(-core_str, -part1, -part2, -part3, -part4)  # 可选:删除中间临时列

你之前可能踩的坑

  1. substr位置计算错误:要注意去掉X后的字符串长度,示例中去掉X后是16位,各段的起始/结束位置必须精准对应
  2. paste未指定sep参数:默认paste用空格分隔,必须显式加sep="-"才会用连字符拼接
  3. unite使用时机不对:如果用unite合并,得先把拆分后的各段单独存成列,再执行合并操作,不能直接一步到位

内容的提问来源于stack exchange,提问作者user21303460

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:03:13