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