Мы можем использовать str_extract_all
вместо str_extract
, поскольку str_extract
соответствует только первому экземпляру, где суффикс _all
является глобальным и извлечет все экземпляры в list
, которые можно преобразовать обратно в два столбца с unnest_wider
library(dplyr)
library(tidyr)
library(stringr)
d %>%
mutate(out = str_extract_all(x, "\\d{2}")) %>%
unnest_wider(c(out)) %>%
rename_at(-1, ~ c('y', 'z')) %>%
type.convert(as.is = TRUE)
# A tibble: 3 x 3
# x y z
# <chr> <int> <int>
#1 i am 10 and she is 50 10 50
#2 he is 32 and i am 22 32 22
#3 he may be 70 and she may be 99 70 99
Если нам нужно в качестве строкового столбца с ,
в качестве разделителя, после извлечения в list
, l oop над list
с map
и объединить все элементы в одну строку с помощью toString
(оболочка для paste(., collapse=", ")
)
library(purrr)
d %>%
mutate(y = str_extract_all(x, "\\b\\d{2}\\b") %>%
map_chr(toString))
# A tibble: 3 x 2
# x y
# <chr> <chr>
#1 i am 10 and she is 50 10, 50
#2 he is 32 and i am 22 32, 22
#3 he may be 70 and she may be 99 70, 99