совпадение строк регулярное выражение точное совпадение - специальные символы

Следуя решенной теме здесь: соответствие строк регулярному выражению точное совпадение (с небольшой благодарностью @Onyambu за обновленный код).

Мне нужно точно сопоставить строки - даже если есть специальные символы.

Примечание - извиняюсь, это третий вопрос по этому поводу. Я почти у цели, но теперь я не знаю, как обрабатывать специальные символы, и я все еще повышаю квалификацию по управлению строками в r.

ОБНОВЛЕНО ДЛЯ ЯСНОСТИ:

У меня есть таблица соответствий слов / строк вроде этой:

codes <- structure(
  list(
    column1 = structure(
      c(2L, 3L, NA),
      .Label = c("",
                 "4+", "4 +"),
      class = "factor"
    ),
    column2 = structure(
      c(1L,
        3L, 2L),
      .Label = c("old", "the money", "work"),
      class = "factor"
    ),
    column3 = structure(
      c(3L, 2L, NA),
      .Label = c("", "wonderyears",
                 "woke"),
      class = "factor"
    )
  ),
  row.names = c(NA,-3L),
  class = "data.frame"
)

И набор данных, в котором есть столбец строк. Я хочу увидеть, включен ли какой-либо из кодов в каждую из записей в строках:

strings<- structure(
  list(
    SurveyID = structure(
      1:4,
      .Label = c("ID_1", "ID_2",
                 "ID_3", "ID_4"),
      class = "factor"
    ),
    Open_comments = structure(
      c(2L,
        4L, 3L, 1L),
      .Label = c(
        "I need to pick up some apples",
        "The system works",
        "Flag only if there is a 4 with a plus",
        "Show me the money"
      ),
      class = "factor"
    )
  ),
  class = "data.frame",
  row.names = c(NA,-4L)
)

В настоящее время я сопоставляю коды строкам, используя следующий код:

strings[names(codes)] <- lapply(codes, function(x) 
  +(grepl(paste0("\\b", na.omit(x), "\\b", collapse = "|"), strings$Open_comments)))

Выход:

  SurveyID                         Open_comments column1 column2 column3
1     ID_1                      The system works       0       0       0
2     ID_2                     Show me the money       0       1       0
3     ID_3 Flag only if there is a 4 with a plus       1       0       0
4     ID_4         I need to pick up some apples       0       0       0

Проблема - строка 3 ID_3 Я хочу отметить это только в том случае, если строка включает 4+ или 4+, но она все равно помечается. Есть ли способ точно его запечатлеть?


person Keelin    schedule 10.09.2020    source источник
comment
Каков ожидаемый результат   -  person akrun    schedule 10.09.2020
comment
4 + и 4+ находятся в столбце 1. это опечатка   -  person akrun    schedule 10.09.2020
comment
I need to pick up 4 apples is being highlighted in column 1 even though it doesn't have a +.. В столбце 1 вывода отображается 1 для этого.   -  person akrun    schedule 10.09.2020
comment
Привет @akrun. В столбце для 4 не должно быть 1, только если оно равно 4+ или 4+, но не 4 само по себе. Имеет ли это смысл?   -  person Keelin    schedule 10.09.2020
comment
Итак, результат должен быть 1 0 0 0 правильно?   -  person akrun    schedule 10.09.2020
comment
В первом ряду я вижу 4+ stars   -  person akrun    schedule 10.09.2020
comment
Хорошо, в этом случае ваш код также должен иметь apples   -  person akrun    schedule 10.09.2020
comment
Извините, возможно, вы не можете понять, в чем именно заключается проблема. Не могли бы вы обновить сообщение ожидаемым результатом?   -  person akrun    schedule 10.09.2020
comment
Я обновил код, чтобы было понятно, что это строка 3, которая помечается, хотя коды 4+ или 4+ не включены.   -  person Keelin    schedule 10.09.2020
comment
В решении, которое я опубликовал, он дает все 0, поскольку в новом примере не было точного совпадения с +   -  person akrun    schedule 10.09.2020


Ответы (1)


Мы можем избежать +, чтобы оценить его буквально

+(grepl(paste0( "(", gsub("\\+", "\\\\+", na.omit(codes$column1)), ")",
     collapse="|"), strings$Open_comments))
#[1] 0 0 0 0

Если мы используем строку с 4+, она подберет

+(grepl(paste0( "(", gsub("\\+", "\\\\+", na.omit(codes$column1)), ")",
     collapse="|"), "Flag only if there is a 4+ with a plus"))
#[1] 1

И для нескольких столбцов

sapply(codes, function(x)+(grepl(paste0( "\\b(", 
      gsub("\\+", "\\\\+", na.omit(x)), ")\\b",
      collapse="|"), strings$Open_comments)))
#     column1 column2 column3
#[1,]       0       0       0
#[2,]       0       1       0
#[3,]       0       0       0
#[4,]       0       0       0
person akrun    schedule 10.09.2020
comment
Спасибо @akrun, работаю над этим небольшим тестом, но по какой-то причине не справляюсь с реальным набором данных. - person Keelin; 10.09.2020
comment
@Keelin Может быть, шаблоны разные - person akrun; 10.09.2020
comment
@Keelin, можете ли вы показать пример строки, которая не работает? Благодарность - person akrun; 10.09.2020
comment
Это странный вопрос - я думаю, что это проблема, связанная с файлом *. Собираюсь попытаться удалить их из полного набора данных и посмотреть, работает ли это - person Keelin; 10.09.2020
comment
Большое спасибо @akrun, теперь он работает очень хорошо. Еще раз спасибо за вашу помощь. - person Keelin; 13.09.2020