#r #regex #stringr
#r #регулярное выражение #stringr
Вопрос:
У меня есть некоторые данные в этом формате:
Name Number 1 The Beatles 100 2 Rolling Stones, The 100 3 Puff The Magic Dragon 100 4 The Offspring 100
df <- data.frame(stringsAsFactors=FALSE,
Name = c("The Beatles", "Rolling Stones, The", "Puff The Magic Dragon",
"The Offspring"),
Number = c(100L, 100L, 100L, 100L)
)
Я хотел бы удалить:
- «The», когда это в начале. Итак, «The Beatles» должно быть «Битлз»
- «, » когда это в конце. Итак, «Rolling Stones, The» должно быть «Rolling Stones».
Но я хотел бы оставить:
- «Puff The Magic Dragon» следует оставить в покое.
Это то, что я пробовал, но это убирает «The» из «Puff the Magic Dragon», а это не то, что я хочу.
library(stringr)
df$Name <- str_replace(string = df$Name, "\, The", "")
df$Name <- str_replace(string = df$Name, "The", "")
Дает это:
Name Number 1 Beatles 100 2 Rolling Stones 100 3 Puff Magic Dragon 100 4 Offspring 100
В то время как мой желаемый результат:
Name Number 1 Beatles 100 2 Rolling Stones 100 3 Puff The Magic Dragon 100 4 Offspring 100
Ответ №1:
Вы можете использовать якоря ^
и $
для обозначения начала и конца каждой строки. Вы также можете объединить группы шаблонов с |
, чтобы использовать только один шаблон, и вы можете использовать функцию удобства str_remove()
для str_replace(replacement = "")
. Это регулярные выражения, и они предоставляют очень краткий метод обработки строк. Дополнительную информацию об якорях смотрите здесь.
library(tidyverse)
df <- data.frame(
stringsAsFactors = FALSE,
Name = c(
"The Beatles", "Rolling Stones, The", "Puff The Magic Dragon",
"The Offspring"
),
Number = c(100L, 100L, 100L, 100L)
)
df %>%
mutate(Name = str_remove_all(Name, "(^The )|(, The$)"))
#> Name Number
#> 1 Beatles 100
#> 2 Rolling Stones 100
#> 3 Puff The Magic Dragon 100
#> 4 Offspring 100
Создано 2019-03-14 пакетом reprex (версия 0.2.1)
Ответ №2:
ИЛИ с sub
sub("^The |, The$", "", df$Name)
#[1] "Beatles" "Rolling Stones" "Puff The Magic Dragon" "Offspring"
Или с str_replace
library(tidyverse)
df %>%
mutate(Name = str_replace(Name, "^The |, The$", ""))
# Name Number
#1 Beatles 100
#2 Rolling Stones 100
#3 Puff The Magic Dragon 100
#4 Offspring 100