R extract first number from string

With str_extract from stringr:

library(stringr)

vec = c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27", 
        "Pic 29 + 30", "Pic 30 + 29", "Pic 31 + 32")

str_extract(v1, "[0-9]+")
# [1] "26" "27" "28" "29" "30" "31"

You can do this very nicely with the str_first_number() function from the strex package, or for more general needs, you can use the str_nth_number() function. Install it with install.packages("strex").

library(strex)
#> Loading required package: stringr
strings <- c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27",
             "Pic 29 + 30", "Pic 30 + 29", "Pic 31 + 32")
str_first_number(strings)
#> [1] 26 27 28 29 30 31
str_nth_number(strings, n = 1)
#> [1] 26 27 28 29 30 31

I assume that you'd like to extract the first of two numbers in each string.

You may use the stri_extract_first_regex function from the stringi package:

library(stringi)
stri_extract_first_regex(c("Pic 26+25", "Pic 1,2,3", "no pics"), "[0-9]+")
## [1] "26" "1"  NA  

In the responses below we use this test data:

# test data
v1 <- c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27", "Pic 29 + 30", 
"Pic 30 + 29", "Pic 31 + 32")

1) gsubfn

library(gsubfn)

strapply(v1, "(\\d+).*", as.numeric, simplify = c)
## [1] 26 27 28 29 30 31

2) sub This requires no packages but does involve a slightly longer regular expression:

as.numeric( sub("\\D*(\\d+).*", "\\1", v1) )
## [1] 26 27 28 29 30 31

3) read.table This involves no regular expressions or packages:

read.table(text = v1, fill = TRUE)[[2]]
## [1] 26 27 28 29 30 31

In this particular example the fill=TRUE could be omitted but it might be needed if the components of v1 had a differing number of fields.