如何在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) # 可选:删除中间临时列
你之前可能踩的坑
- substr位置计算错误:要注意去掉X后的字符串长度,示例中去掉X后是16位,各段的起始/结束位置必须精准对应
- paste未指定sep参数:默认paste用空格分隔,必须显式加
sep="-"才会用连字符拼接 - unite使用时机不对:如果用unite合并,得先把拆分后的各段单独存成列,再执行合并操作,不能直接一步到位
内容的提问来源于stack exchange,提问作者user21303460
相关产品推荐
相关产品推荐

