Исключения в выражениях регулярных выражений при задании данных с помощью grepl - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь поместить данные в R определенными символами в поле и не могу найти правильную логику регулярных выражений, чтобы получить то, что мне нужно.Мне нужно подмножество записей, для которых идентификатор содержит либо:

  • Просто "AB"
  • "AB" и "ABC"
  • Но НЕ поля с ТОЛЬКО "ABC "

Эти шаблоны находятся в любой части поля (начало, середина, конец) в этом наборе данных и не имеют определенных разделителей.

Пример набора данных TEST:

 Record     ID                value
 1          blueAB_ABC        7
 2          green_ABCblue    9
 3          ABC_green         45
 4          green_AB          23
 5          CD_red            45

Так что для этого примера я бы хотел поместить записи 1 и 4.

Я дошел до того, что возвращал толькоAB и исключая ABC, но не могу найти подходящего регулярного выражения, чтобы получить все с "AB" и, возможно, с "ABC".

AB_set <- subset(TEST, grepl("*AB", ID) & !grepl("*ABC", ID) )

 Record     ID                value
 4          green_AB          23

Что я надеюсь получить:

 Record     ID                value
 1          blueAB_ABC       7
 4          green_AB          23

РЕДАКТИРОВАТЬ: просто чтобы уточнить, я обновил набор данных, чтобы показать, что рассматриваемый шаблон может находиться рядом с другими символами, кроме подчеркивания, или может не обязательно появляться в начале / конце (как отмечалось ранее, «нет определенных разделителей»).

Ответы [ 2 ]

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

«ABC» не требуется, потому что «AB» всегда должен совпадать.Следующее соответствует AB только в том случае, если оно окружено подчеркиванием или оно начинает или заканчивает ID:

AB_set <- subset(TEST, grepl("(^|_)AB(_|$)", TEST$ID))

Результат:

  Record          ID value
1      1 blue_AB_ABC     7
4      4    green_AB    23

Данные:

TEST = structure(list(Record = 1:5, ID = structure(c(2L, 5L, 1L, 4L, 
3L), .Label = c("ABC_green", "blue_AB_ABC", "CD_red", "green_AB", 
"green_ABC_blue"), class = "factor"), value = c(7L, 9L, 45L, 
23L, 45L)), .Names = c("Record", "ID", "value"), class = "data.frame", row.names = c(NA, 
-5L))
0 голосов
/ 18 мая 2018

Вы можете получить это, указав, что «AB» должен быть окружен либо подчеркиванием, либо границей слова.

 df[grepl("(\\b|_)AB(\\b|_)", df$ID),]
  Record          ID value
1      1 blue_AB_ABC     7
4      4    green_AB    23
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...