从连接的字符串中提取前 n 个字符

extract the first n characters from concatenated strings

我有一个包含两列的数据框:idvalue

id <- seq(1,5)
value <- c("123;21232;78678",
           "4575;23423",
           "1245;45757;45375;39873",
           "787;536453;1121;3232;58684;2434",
           "444;44444;4444;444")

df <- data.frame(id, value)
df$value <- as.character(df$value)

我需要提取每个数字的前两位数字(以;分隔)。输出看起来像:

我们可以使用 str_extract_allstringr

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"  

仅使用基础 R:

df$value_2 = sapply(strsplit(df$value, ';'), function(i){
    paste(substr(i, 1, 2), collapse = ';')
})

逐行进行,每个字符串用分号分隔,然后提取前两个字符,returns将它们放入一个用分号分隔的新字符串中。

这会给你:

  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