如何使用每行的不同字符位置对 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