#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"