在非对称字符串-R中提取数字



我想提取数据集中字符串(名称(中的数字,并使用data.table包将其添加为新列(new_column(。要提取的数字介于最后_和-之间

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

一个可能的解决方案:

library(data.table)
dt[, new := sub(".*_(\d+)-.*", "\1", name)][]
#>                             name New_column new
#>  1:    430_6_PPP_NL_HH2_1_3-4min          3   3
#>  2:    430_6_PPP_NL_HH2_2_4-5min          4   4
#>  3:    430_6_PPP_NL_HH2_3_6-7min          6   6
#>  4:  430_6_PPP_NL_HH2_4_13-14min         13  13
#>  5:    430_6_PPP_NL_HH2_14-15min         14  14
#>  6:    430_6_PPP_NL_HH2_15-16min         15  15
#>  7:    430_6_PPP_NL_HH2_16-17min         16  16
#>  8:    430_6_PPP_NL_HH2_17-18min         17  17
#>  9:    430_6_PPP_NL_HH2_18-19min         18  18
#> 10:    430_6_PPP_NL_HH2_19-20min         19  19
#> 11: 430_6_PPP_NL_HH2_11_20-21min         20  20
#> 12: 430_6_PPP_NL_HH2_12_21-22min         21  21
#> 13: 430_6_PPP_NL_HH2_13_22-23min         22  22
#> 14: 430_6_PPP_NL_HH2_14_23-24min         23  23
#> 15:    430_5_PPP_NL_HH4_1_3-4min          3   3
#> 16:    430_5_PPP_NL_HH4_2_4-5min          4   4
#> 17:    430_5_PPP_NL_HH4_3_6-7min          6   6
#> 18:  430_5_PPP_NL_HH4_4_13-14min         13  13
#> 19:  430_5_PPP_NL_HH4_5_14-15min         14  14
#> 20:  430_5_PPP_NL_HH4_6_15-16min         15  15
#> 21:  430_5_PPP_NL_HH4_7_16-17min         16  16
#> 22:  430_5_PPP_NL_HH4_8_17-18min         17  17
#> 23:  430_5_PPP_NL_HH4_9_18-19min         18  18
#> 24: 430_5_PPP_NL_HH4_10_19-20min         19  19
#> 25: 430_5_PPP_NL_HH4_11_20-21min         20  20
#> 26: 430_5_PPP_NL_HH4_12_21-22min         21  21
#> 27: 430_5_PPP_NL_HH4_13_22-23min         22  22
#> 28: 430_5_PPP_NL_HH4_14_23-24min         23  23
#> 29: 430_5_PPP_NL_HH4_15_24-25min         24  24
#>                             name New_column new

另一种可能的解决方案,基于tidyverse:

library(tidyverse)
library(data.table)
dt %>% 
mutate(new = str_extract(name, "(?<=_)\d+(?=-)"))
#>                             name New_column new
#>  1:    430_6_PPP_NL_HH2_1_3-4min          3   3
#>  2:    430_6_PPP_NL_HH2_2_4-5min          4   4
#>  3:    430_6_PPP_NL_HH2_3_6-7min          6   6
#>  4:  430_6_PPP_NL_HH2_4_13-14min         13  13
#>  5:    430_6_PPP_NL_HH2_14-15min         14  14
#>  6:    430_6_PPP_NL_HH2_15-16min         15  15
#>  7:    430_6_PPP_NL_HH2_16-17min         16  16
#>  8:    430_6_PPP_NL_HH2_17-18min         17  17
#>  9:    430_6_PPP_NL_HH2_18-19min         18  18
#> 10:    430_6_PPP_NL_HH2_19-20min         19  19
#> 11: 430_6_PPP_NL_HH2_11_20-21min         20  20
#> 12: 430_6_PPP_NL_HH2_12_21-22min         21  21
#> 13: 430_6_PPP_NL_HH2_13_22-23min         22  22
#> 14: 430_6_PPP_NL_HH2_14_23-24min         23  23
#> 15:    430_5_PPP_NL_HH4_1_3-4min          3   3
#> 16:    430_5_PPP_NL_HH4_2_4-5min          4   4
#> 17:    430_5_PPP_NL_HH4_3_6-7min          6   6
#> 18:  430_5_PPP_NL_HH4_4_13-14min         13  13
#> 19:  430_5_PPP_NL_HH4_5_14-15min         14  14
#> 20:  430_5_PPP_NL_HH4_6_15-16min         15  15
#> 21:  430_5_PPP_NL_HH4_7_16-17min         16  16
#> 22:  430_5_PPP_NL_HH4_8_17-18min         17  17
#> 23:  430_5_PPP_NL_HH4_9_18-19min         18  18
#> 24: 430_5_PPP_NL_HH4_10_19-20min         19  19
#> 25: 430_5_PPP_NL_HH4_11_20-21min         20  20
#> 26: 430_5_PPP_NL_HH4_12_21-22min         21  21
#> 27: 430_5_PPP_NL_HH4_13_22-23min         22  22
#> 28: 430_5_PPP_NL_HH4_14_23-24min         23  23
#> 29: 430_5_PPP_NL_HH4_15_24-25min         24  24
#>                             name New_column new

使用data.table

library(data.table)
df[ , New_column := sub(".+_.+_" , "" , sub("-\d+min" , "" , name))][]
  • 输出
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

最新更新