从连接的字符串中提取前 n 个字符
extract the first n characters from concatenated strings
我有一个包含两列的数据框: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)
我需要提取每个数字的前两位数字(以;
分隔)。输出看起来像:
我们可以使用 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"
仅使用基础 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
我有一个包含两列的数据框: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)
我需要提取每个数字的前两位数字(以;
分隔)。输出看起来像:
我们可以使用 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"
仅使用基础 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