Удалить строку, кроме указанных полей

#r #regex #str-replace #gsub

#r #регулярное выражение #str-заменить #gsub

Вопрос:

Я надеюсь использовать str_replace или gsub, чтобы удалить символы » WD » и заменить их на » » из столбца в моем фрейме данных. Однако в столбце есть определенные поля, из которых я не хочу, чтобы символы «WD» удалялись. Обратите внимание, что в данных, которые я обрабатываю, содержится более 8000 объектов, поэтому строка кода без необходимости вводить каждую строку поля, которую я хотел бы изменить, необходима.

 df = PA_prec

COLUMN

PA CRAWFORD MEADVILLE WD 02

PA CRAWFORD TITUSVILLE WD 02

PA BLAIR HOLLIDAYSBURG WD 01

PA BLAIR ALTOONA WD 03
  

ЦЕЛЬ: я хочу, чтобы все символы «WD» были удалены, кроме как в П.А. Кроуфорд ТАЙТУСВИЛЛ и П.А. Блэр ХОЛЛИДЕЙСБУРГ.

Код должен выглядеть примерно так:

 PA_prec$COLUMN <- str_replace(PA_prec$COLUMN, " WD ", " ")
  

или

 PA_prec$COLUMN <- gsub("\.", "", PA_prec$COLUMN)
  

…но мне нужно исключить два поля, перечисленные выше.

Спасибо за любую помощь, которую вы можете предоставить!

Ответ №1:

Вы можете использовать это:

 sub("(?<!TITUSVILLE |HOLLIDAYSBURG )WD ", "", x, perl = T)
  

Здесь мы используем отрицательный взгляд назад, который можно замаскировать как «совпадение, если вы не видите… слева». Примечание: это работает только sub в том случае, если вы используете perl = T .

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

1. Замечательно! Похоже, это сработало. Однако, знаете ли вы, могу ли я идентифицировать WD как «WD», чтобы я мог убедиться, что удаляю символ WD только там, где спереди и сзади есть пробел? Я попытался добавить пробел в начало и конец WD в отправленном вами коде, и это не сработало. Спасибо 🙂

2. Пожалуйста, смотрите отредактированное решение: теперь это удаляет WD , не оставляя лишних пробелов.

Ответ №2:

Использовать

 (?<!TITUSVILLE|HOLLIDAYSBURG)sWDs
  

См. пуф.

Объяснение

 --------------------------------------------------------------------------------
  (?<!                     look behind to see if there is not:
--------------------------------------------------------------------------------
    TITUSVILLE               'TITUSVILLE'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    HOLLIDAYSBURG            'HOLLIDAYSBURG'
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  s                       whitespace (n, r, t, f, and " ")
--------------------------------------------------------------------------------
  WD                       'WD'
--------------------------------------------------------------------------------
  s                       whitespace (n, r, t, f, and " ")
  

<a rel="noreferrer noopener nofollow" href="https:///Try it online!» rel=»nofollow noreferrer»>R-код:

 df <- data.frame(COLUMN=c("PA CRAWFORD MEADVILLE WD 02","PA CRAWFORD TITUSVILLE WD 02","PA BLAIR HOLLIDAYSBURG WD 01","PA BLAIR ALTOONA WD 03"))
df$COLUMN <- sub("(?<!TITUSVILLE|HOLLIDAYSBURG)\sWD\s", " ", df$COLUMN, perl=TRUE)
df
  

Вывод:

                         COLUMN
1     PA CRAWFORD MEADVILLE 02
2 PA CRAWFORD TITUSVILLE WD 02
3 PA BLAIR HOLLIDAYSBURG WD 01
4          PA BLAIR ALTOONA 03