使用data.table包提取非对称字符串指定位置数字并新增列(R语言)
使用data.table提取指定位置的数字并新增列
解决方案
通过正则表达式匹配目标数字,结合data.table的高效赋值语法可快速完成需求。以下是具体实现:
1. 构造示例数据集(与你提供的内容一致)
library(data.table) dt <- data.table( name = c( "430_6_PPP_NL_HH2_1_3-4min", "430_6_PPP_NL_HH2_2_4-5min", "430_6_PPP_NL_HH2_3_6-7min", "430_6_PPP_NL_HH2_4_13-14min", "430_6_PPP_NL_HH2_14-15min", "430_6_PPP_NL_HH2_15-16min", "430_6_PPP_NL_HH2_16-17min", "430_6_PPP_NL_HH2_17-18min", "430_6_PPP_NL_HH2_18-19min", "430_6_PPP_NL_HH2_19-20min", "430_6_PPP_NL_HH2_11_20-21min", "430_6_PPP_NL_HH2_12_21-22min", "430_6_PPP_NL_HH2_13_22-23min", "430_6_PPP_NL_HH2_14_23-24min", "430_5_PPP_NL_HH4_1_3-4min", "430_5_PPP_NL_HH4_2_4-5min", "430_5_PPP_NL_HH4_3_6-7min", "430_5_PPP_NL_HH4_4_13-14min", "430_5_PPP_NL_HH4_5_14-15min", "430_5_PPP_NL_HH4_6_15-16min", "430_5_PPP_NL_HH4_7_16-17min", "430_5_PPP_NL_HH4_8_17-18min", "430_5_PPP_NL_HH4_9_18-19min", "430_5_PPP_NL_HH4_10_19-20min", "430_5_PPP_NL_HH4_11_20-21min", "430_5_PPP_NL_HH4_12_21-22min", "430_5_PPP_NL_HH4_13_22-23min", "430_5_PPP_NL_HH4_14_23-24min", "430_5_PPP_NL_HH4_15_24-25min" ) )
2. 提取数字并新增列
提供两种实现方式,按需选择:
# 方式1:使用base R的sub函数(无需额外安装包) dt[, New_column := as.integer(sub(".*_(\\d+)-.*", "\\1", name))] # 方式2:使用stringr包的str_extract(语法更直观) # library(stringr) # dt[, New_column := as.integer(str_extract(name, "(?<=_)\\d+(?=-)"))]
3. 结果验证
运行代码后,dt会新增New_column列,内容与你期望的完全一致:
print(dt)
输出:
name New_column 1: 430_6_PPP_NL_HH2_1_3-4min 3 2: 430_6_PPP_NL_HH2_2_4-5min 4 3: 430_6_PPP_NL_HH2_3_6-7min 6 4: 430_6_PPP_NL_HH2_4_13-14min 13 5: 430_6_PPP_NL_HH2_14-15min 14 6: 430_6_PPP_NL_HH2_15-16min 15 7: 430_6_PPP_NL_HH2_16-17min 16 8: 430_6_PPP_NL_HH2_17-18min 17 9: 430_6_PPP_NL_HH2_18-19min 18 10: 430_6_PPP_NL_HH2_19-20min 19 11: 430_6_PPP_NL_HH2_11_20-21min 20 12: 430_6_PPP_NL_HH2_12_21-22min 21 13: 430_6_PPP_NL_HH2_13_22-23min 22 14: 430_6_PPP_NL_HH2_14_23-24min 23 15: 430_5_PPP_NL_HH4_1_3-4min 3 16: 430_5_PPP_NL_HH4_2_4-5min 4 17: 430_5_PPP_NL_HH4_3_6-7min 6 18: 430_5_PPP_NL_HH4_4_13-14min 13 19: 430_5_PPP_NL_HH4_5_14-15min 14 20: 430_5_PPP_NL_HH4_6_15-16min 15 21: 430_5_PPP_NL_HH4_7_16-17min 16 22: 430_5_PPP_NL_HH4_8_17-18min 17 23: 430_5_PPP_NL_HH4_9_18-19min 18 24: 430_5_PPP_NL_HH4_10_19-20min 19 25: 430_5_PPP_NL_HH4_11_20-21min 20 26: 430_5_PPP_NL_HH4_12_21-22min 21 27: 430_5_PPP_NL_HH4_13_22-23min 22 28: 430_5_PPP_NL_HH4_14_23-24min 23 29: 430_5_PPP_NL_HH4_15_24-25min 24
正则表达式解释
- 方式1中的
.*_(\\d+)-.*:.*_:贪婪匹配任意字符直到最后一个下划线(\\d+):捕获一个或多个数字(目标内容)-.*:匹配短横线及之后的所有字符\\1:引用捕获到的数字内容
- 方式2中的
(?<=_)\\d+(?=-):(?<=_):正向预查,确保目标数字前是下划线\\d+:匹配一个或多个数字(?=-):正向预查,确保目标数字后是短横线
内容的提问来源于stack exchange,提问作者Rebecca Matos
相关产品推荐
相关产品推荐

