Определить набор строк и удалить их из столбца

#r #regex

#r #регулярное выражение

Вопрос:

Я пытаюсь выполнить цикл по столбцу и удалить все символы из начала строки, которые подпадают под мой предопределенный набор строк.

Воспроизводимый пример

 df <- data.frame(serial = 1:3, name = c("Javier", "Kenneth", "Kasey"))

  serial    name
1      1  Javier
2      2 Kenneth
3      3   Kasey
  

Вектор условий
Удаляет эти строки только с начала имени!

 vec <- c("Ja", "Ka")
  

Предполагаемый результат

   serial    name
1      1    vier
2      2 Kenneth
3      3     sey
  

Ответ №1:

Мы могли бы создать шаблон путем вставки vec в один вектор и удалить их появление с помощью sub .

 df$name <- sub(paste0("^", vec, collapse = "|"), "", df$name)

df
#  serial    name
#1      1    vier
#2      2 Kenneth
#3      3     sey
  

В stringr мы также можем использовать str_remove

 stringr::str_remove(df$name, paste0("^", vec, collapse = "|"))
#[1] "vier"    "Kenneth" "sey" 
  

Комментарии:

1. Эй, @Ronak, это удаляет символы только в начале? Например, он не должен удалять символы («Ja») из «helloJavier»

2. @Javier Извините, я пропустил эту часть. Я обновил ответ, чтобы он удалял символы только с самого начала.

Ответ №2:

Поскольку в этом примере мы используем vec строки фиксированной длины, возможно, даже более эффективно использовать substr замены. Это действительно окупится только в том случае, когда df и / или vec является большим, хотя и достигается ценой некоторой гибкости.

 df$name <- as.character(df$name)
sel <- substr(df$name, 1, 2) %in% vec
df$name[sel] <- substr(df$name, 3, nchar(df$name))[sel]

#  serial    name
#1      1    vier
#2      2 Kenneth
#3      3     sey
  

Ответ №3:

Мы также можем сделать это с substring

 library(stringr)
library(dplyr)
df$name <- substring(df$name, replace_na(str_locate(df$name, 
               paste(vec, collapse="|"))[,2]   1, 1))
df$name
#[1] "vier"    "Kenneth" "sey"   
  

Или с помощью str_replace

 str_replace(df$name, paste0("^", vec,  collapse="|"), "")
#[1] "vier"    "Kenneth" "sey"    
  

Или с помощью gsubfn

 library(gsubfn)
gsubfn("^.{2}", setNames(rep(list(""), length(vec)), vec), as.character(df$name))
#[1] "vier"    "Kenneth" "sey"