Как я могу заменить текст только в определенных позициях, например («Битлз» или «Битлз, THE») - PullRequest
1 голос
/ 15 марта 2019

У меня есть данные в этом формате:

                   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», когда оно в начале. Так что "Битлз" должны быть "Битлз"
  • "," когда это в конце. Так что «Роллинг Стоунз» должно быть «Роллинг Стоунз».

Но я бы хотел уйти:

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

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Вы можете использовать якоря ^ и $, чтобы указать начало и конец каждой строки. Вы также можете комбинировать группы шаблонов с |, чтобы использовать только один шаблон, и вы можете использовать вспомогательную функцию 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 пакетом Представ (v0.2.1)

2 голосов
/ 15 марта 2019

ИЛИ с 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
...