简体   繁体   中英

Is there a tidyr::extract equivalent for character vectors?

I was pondering on this after having come across another question .

library(tidyverse)

set.seed(42)
df <- data.frame(x = cut(runif(100), c(0,25,75,125,175,225,299)))

tidyr::extract does a nice job splitting into groups defined by the regex:

df %>%
  extract(x, c("start", "end"), "(\\d+),(\\d+)") %>% head
#>   start end
#> 1     0  25
#> 2     0  25
#> 3     0  25
#> 4     0  25
#> 5     0  25
#> 6     0  25

Desired output on a character vector. I know you could just create a new function, I wondered if this is already out there.

x_chr <- as.character(df$x)
des_res <- str_split(str_extract(x_chr, "(\\d+),(\\d+)"), ",") 

head(des_res)
#> [[1]]
#> [1] "0"  "25"
#> 
#> [[2]]
#> [1] "0"  "25"
#> 
#> [[3]]
#> [1] "0"  "25"
#> 
#> [[4]]
#> [1] "0"  "25"
#> 
#> [[5]]
#> [1] "0"  "25"
#> 
#> [[6]]
#> [1] "0"  "25"

You can use strcapture in base R:

strcapture("(\\d+),(\\d+)", x_chr, 
           proto = list(start = numeric(), end = numeric()))

#    start end
#1       0  25
#2       0  25
#3       0  25
#4       0  25
#5       0  25
#6       0  25
#...
#...

You can also use stringr::str_match :

stringr::str_match(x_chr, "(\\d+),(\\d+)")[, -1]

In str_match , 1st column returns the complete pattern whereas all the subsequent columns are the capture groups.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM