How to use stringr::str_match_all inside dplyr::mutate in the tidyverse pipe

问题描述 投票:0回答:1

使用 stringr::str_match,我可以创建一个列,其中包含每行中第一个“H45”实例的“H45”之后的字符。

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])

我想使用 stringr::str_match_all 创建一个列,其中包含每行中every 出现“H45”之后的字符。但是,我无法让 str_match_all 在 tidyverse 管道中运行。我认为这是因为我不知道在管道中调用 [[1]][,2] 的正确语法。

它作为独立的代码行工作:

str_match_all("H459 A452 H4544", 'H45([[0-9]]{1,2})')[[1]][,2]

我希望得到这样的输出,其中“H45_value”的第一个值是一个列表或类似的:

A H45_值
H459 A452 H4544 9, 44
A452 NA
H4535 35
r regex dplyr stringr mutate
1个回答
0
投票

str_extract_all()
是一个更好的函数选择,因为它默认返回提取值列表而不是
str_match_all()
返回的矩阵。所以你可以这样做:

library(dplyr)
library(stringr)

df %>%
  mutate(H45_value = str_extract_all(A, "(?<=H45)\\d+"))

# A tibble: 3 × 2
  A               H45_value
  <chr>           <list>   
1 H459 A452 H4544 <chr [2]>
2 A452            <chr [0]>
3 H4535           <chr [1]>

H45_value
包含:

[[1]]
[1] "9"  "44"

[[2]]
character(0)

[[3]]
[1] "35"

如果你想使用

str_match_all()
你需要迭代结果并提取第二列:

lapply(str_match_all(A, 'H45([[0-9]]{1,2})'), `[`, , 2)
© www.soinside.com 2019 - 2024. All rights reserved.