如何使用每行的不同字符位置对 R 中的列进行子字符串化
How to substring column in R using different character locations for each row
我想在数据框中创建一个附加列,它是数据框中现有列的子字符串,但每行使用不同的起点和终点。
具体来说,下例中的“codes”列在字符串的某处包含一个冒号字符“:”。这个位置在每个字符串中都不同。我要取冒号前两个字符和冒号后两个字符,还有冒号
我目前拥有的一个例子:
letters <- c("A", "B", "C")
codes <- c("lksjdfi99:99lksjdf", "nsj78:12osjsm", "a12:67opaidsf")
df <- data.frame(letters, codes)
print(df)
letters codes
1 A lksjdfi99:99lksjdf
2 B nsj78:12osjsm
3 C a12:67opaidsf
这是我想要的示例:
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
如有任何帮助,我们将不胜感激。
您可以使用 str_extract
:
library(stringr)
df$new_col <- str_extract(df$codes, "\d+:\d+")
df
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
或者您可以使用:
str_replace(df$codes,".*(\d{2}:\d{2}).*", "\1")
或者,在 base R
中:
gsub(".*(\d{2}:\d{2}).*", "\1", df$codes)
您还可以这样做:
library(tidyverse)
df <- df %>%
extract(codes, 'new_col', '(\d+:\d+)', remove = FALSE)
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
我们可以在base R
中使用sub
df$new_col <- sub("\D+(\d+:\d+)\D+", "\1", df$codes)
-输出
> df
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
这是一个 tidyverse 解决方案:
library(tidyr)
library(readr)
library(dplyr)
df %>%
separate(codes, c("split1", "split2"), remove=FALSE) %>%
mutate(across(starts_with("split"), parse_number)) %>%
mutate(new_col= paste(split1, split2, sep=":"), .keep="unused")
输出:
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
我想在数据框中创建一个附加列,它是数据框中现有列的子字符串,但每行使用不同的起点和终点。
具体来说,下例中的“codes”列在字符串的某处包含一个冒号字符“:”。这个位置在每个字符串中都不同。我要取冒号前两个字符和冒号后两个字符,还有冒号
我目前拥有的一个例子:
letters <- c("A", "B", "C")
codes <- c("lksjdfi99:99lksjdf", "nsj78:12osjsm", "a12:67opaidsf")
df <- data.frame(letters, codes)
print(df)
letters codes
1 A lksjdfi99:99lksjdf
2 B nsj78:12osjsm
3 C a12:67opaidsf
这是我想要的示例:
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
如有任何帮助,我们将不胜感激。
您可以使用 str_extract
:
library(stringr)
df$new_col <- str_extract(df$codes, "\d+:\d+")
df
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
或者您可以使用:
str_replace(df$codes,".*(\d{2}:\d{2}).*", "\1")
或者,在 base R
中:
gsub(".*(\d{2}:\d{2}).*", "\1", df$codes)
您还可以这样做:
library(tidyverse)
df <- df %>%
extract(codes, 'new_col', '(\d+:\d+)', remove = FALSE)
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
我们可以在base R
sub
df$new_col <- sub("\D+(\d+:\d+)\D+", "\1", df$codes)
-输出
> df
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67
这是一个 tidyverse 解决方案:
library(tidyr)
library(readr)
library(dplyr)
df %>%
separate(codes, c("split1", "split2"), remove=FALSE) %>%
mutate(across(starts_with("split"), parse_number)) %>%
mutate(new_col= paste(split1, split2, sep=":"), .keep="unused")
输出:
letters codes new_col
1 A lksjdfi99:99lksjdf 99:99
2 B nsj78:12osjsm 78:12
3 C a12:67opaidsf 12:67