Регулярные выражения для удаления записей строк - PullRequest
0 голосов
/ 02 мая 2018

У меня есть пример данных, заданный

df <- data.frame(
country = c("GermanyBerlin", "England (UK)London", "SpainMadrid", "United States of AmericaWashington DC", "HaitiPort-au-Prince", "country66city"),
  capital = c("#Berlin", "NA", "#Madrid", "NA", "NA", "NA"),
  url = c("/country/germany/01", "/country/england-uk/02", "/country/spain/03", "country/united-states-of-america/04", "country/haiti/05", "country/country6/06"),
  stringsAsFactors = FALSE
)

                                country capital                                 url
1                         GermanyBerlin #Berlin                 /country/germany/01
2                    England (UK)London      NA              /country/england-uk/02
3                           SpainMadrid #Madrid                   /country/spain/03
4 United States of AmericaWashington DC      NA country/united-states-of-america/04
5                   HaitiPort-au-Prince      NA                    country/haiti/05
6                         country66city      NA                 country/country6/06

Цель состоит в том, чтобы привести это в порядок, чтобы столбцы были такими, как можно было бы ожидать от их имен:

  • первый должен содержать только название страны.
  • второй должен содержать заглавную букву (без знака #).
  • третий должен остаться без изменений.

Итак, мой желаемый результат:

                  country        capital                                 url
1                  Germany         Berlin                 /country/germany/01
2             England (UK)         London              /country/england-uk/02
3                    Spain         Madrid                   /country/spain/03
4 United States of America  Washington DC country/united-states-of-america/04
5                    Haiti Port-au-Prince                    country/haiti/05
6                 country6          6city                 country/country6/06

В тех случаях, когда в столбце capital есть записи, не относящиеся к NA, у меня есть фрагмент кода, который достигает этого (см. Нижнюю часть сообщения).

Поэтому я ищу решение, которое признает, что шаблон столбца url может использоваться для выделения заглавной буквы из столбца country.

Это необходимо учитывать тот факт, что

  • текст URL-адреса в нижнем регистре, а название страны в том виде, в каком оно отображается в столбце country, имеет смешанные регистры.
  • текст в URL заменяет пробелы дефисами.
  • URL удаляет специальные символы (например, скобки вокруг Великобритании).

Мне было бы интересно посмотреть, как можно достичь этой цели, предположительно с помощью регулярных выражений (хотя они открыты для любых опций).


Частичное решение, когда столбец capital не является NA

Если в столбце capital есть записи, отличные от NA, следующий код достигает моей цели:

df %>% mutate( capital =   str_replace(capital, "#", ""), 
               country = str_replace(country, capital,"") 
              )

                                country capital                                 url
1                               Germany  Berlin                 /country/germany/01
2                    England (UK)London      NA              /country/england-uk/02
3                                 Spain  Madrid                   /country/spain/03
4 United States of AmericaWashington DC      NA country/united-states-of-america/04

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вы можете начать с чего-то подобного и продолжать уточнение, пока не получите (100%) правильные результаты, а затем посмотрите, сможете ли вы пропустить / объединить какие-либо шаги.

library(magrittr)

df$country2 <- df$url %>%
  gsub("-", " ", .) %>%
  gsub(".+try/(.+)/.+", "\\1", .) %>%
  gsub("(\\b[a-z])", "\\U\\1", ., perl = TRUE)

df$capital <- df$country %>%
  gsub("[()]", " ", .) %>%
  gsub(" +", " ", .) %>%
  gsub(paste(df$country2, collapse = "|"), "", ., ignore.case = TRUE)

df$country <- df$country2
df$country2 <- NULL

df
                   country        capital                                 url
1                  Germany         Berlin                 /country/germany/01
2               England Uk         London              /country/england-uk/02
3                    Spain         Madrid                   /country/spain/03
4 United States Of America  Washington DC country/united-states-of-america/04
5                    Haiti Port-au-Prince                    country/haiti/05
6                 Country6          6city                 country/country6/0
0 голосов
/ 02 мая 2018

вы можете сделать

transform(df,capital=sub(".*[A-Z]\\S+([A-Z])","\\1",country))

                               country       capital                                 url
1                         GermanyBerlin        Berlin                 /country/germany/01
2                    England (UK)London        London              /country/england-uk/02
3                           SpainMadrid        Madrid                   /country/spain/03
4 United States of AmericaWashington DC Washington DC country/united-states-of-america/04
...