使用 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 |
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)