有没有类似于tidyr :: extract的字符向量等效函数?

3

在阅读另一个问题后,我深思熟虑。

library(tidyverse)

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

tidyr::extract 很好地将字符串按照正则表达式定义的规则拆分成组:

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

期望输出一个字符向量。我知道你可以创建一个新的函数,但我想知道是否已经有类似功能的现成函数可用。

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"

你可以通过 str_extract_all() 实现:str_extract_all(x_chr, "\\d+") - tmfmnk
这仅适用于此示例 - 我想要一种将其实际分成定义组的方法。 - tjebo
1个回答

5

你可以在基本R中使用strcapture

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
#...
#...

您也可以使用 stringr::str_match
stringr::str_match(x_chr, "(\\d+),(\\d+)")[, -1]

str_match函数中,第一列返回的是完整的匹配模式,而后续所有列则为捕获组。

1
不错,我肯定不知道那个:) 你知道有没有类似于stringi或stringr的东西吗?如果没有也没关系。 - tjebo
1
是的,您可以使用 str_match/stri_match。已更新答案。 - Ronak Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接