如何在tidyverse管道的dplyr::mutate中使用stringr::str_match_all
用stringr::str_match_all在tidyverse管道中提取所有匹配内容生成新列
原代码通过stringr::str_match可以提取每行中首次出现"H45"后的1-2位数字并生成新列,示例如下:
library(dplyr) library(stringr) df <- tibble::tibble(A = c("H459 A452 H4544", "A452", "H4535")) df <- df %>% mutate(H45_value = str_match(A, 'H45([0-9]{1,2})') %>% .[,2])
若要提取每行中所有符合"H45"后1-2位数字的内容,直接在管道中使用str_match_all(...) [[1]][,2]无法正常运行——因为str_match_all返回的是列表结构,每行对应一个匹配结果矩阵,需要逐行处理每个矩阵的第二列(捕获组内容)。单独执行str_match_all("H459 A452 H4544", 'H45([0-9]{1,2})')[[1]][,2]可以正常得到结果,但管道中需要结合purrr的映射函数来实现批量处理。
解决方案代码
library(dplyr) library(stringr) library(purrr) df <- tibble::tibble(A = c("H459 A452 H4544", "A452", "H4535")) df <- df %>% mutate(H45_value = map_chr(A, ~{ # 提取当前字符串的所有匹配捕获组 match_results <- str_match_all(.x, 'H45([0-9]{1,2})')[[1]][,2] # 无匹配返回NA,否则用逗号拼接结果 if (length(match_results) == 0) NA_character_ else paste(match_results, collapse = ", ") }))
执行后输出
| A | H45_value |
|---|---|
| H459 A452 H4544 | 9, 44 |
| A452 | NA |
| H4535 | 35 |
内容的提问来源于stack exchange,提问作者Susie Derkins
相关产品推荐
相关产品推荐

