Home > database >  extracting numbers in non symmetric strings - R
extracting numbers in non symmetric strings - R

Time:08-06

I would like to extract the number within a string (name) in a dataset and add it as a new column (New_column) using data.table package. The numbers to be extracted are between the lasts _ and -

                  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

CodePudding user response:

A possible solution:

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

Another possible solution, based on 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

CodePudding user response:

Using data.table library

library(data.table)

df[ , New_column := sub(". _. _" , "" , sub("-\\d min" , "" , name))][]
  • output
                            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
  • Related