извлечь первые n символов из объединенных строк - PullRequest
1 голос
/ 16 марта 2020

У меня есть фрейм данных с двумя столбцами: id и value.

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)

Мне нужно извлечь первые две цифры каждого числа (разделенные ;). Вывод будет выглядеть так:

enter image description here

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Используя только основную R:

df$value_2 = sapply(strsplit(df$value, ';'), function(i){
    paste(substr(i, 1, 2), 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
2 голосов
/ 16 марта 2020

Мы можем использовать 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"  
...