Мы можем использовать str_extract_all
из stringr
library(stringr)
library(dplyr)
library(purrr)
df %>%
mutate(value_2 = map_chr(str_extract_all(value, "\\b(\\d{2})"),
str_c, collapse=";"))
# id value value_2
#1 1 123;21232;78678 12;21;78
#2 2 4575;23423 45;23
#3 3 1245;45757;45375;39873 12;45;45;39
#4 4 787;536453;1121;3232;58684;2434 78;53;11;32;58;24
#5 5 444;44444;4444;444 44;44;44;44
Или с str_replace_all
df %>%
mutate(value_2 = str_replace_all(value, "(^|;)(..)[^;]+", "\\2;") %>%
trimws(whitespace = ";"))
Или с использованием base R
df$value_2 <- sapply(regmatches(df$value,
gregexpr("\\b(\\d{2})", df$value)), paste, collapse=";")
Или с gsub
из base R
trimws(gsub("(^|;)(..)[^;]+", "\\2;", df$value, perl = TRUE), whitespace = ";")
#[1] "12;21;78" "45;23" "12;45;45;39"
#[4] "78;53;11;32;58;24" "44;44;44;44"