0

This thread follows on from this answered qestion: Matching strings loop over multiple columns

I opened a new thread as I would like to make an update to flag for exact matches only..

I have a table of key words in separate colums as follows:

#codes table
codes <- structure(
  list(
    Support = structure(
      c(2L, 3L, NA),
      .Label = c("",
                 "help", "questions"),
      class = "factor"
    ),
    Online = structure(
      c(1L,
        3L, 2L),
      .Label = c("activities", "discussion board", "quiz", "sy"),
      class = "factor"
    ),
    Resources = structure(
      c(3L, 2L, NA),
      .Label = c("", "pdf",
                 "textbook"),
      class = "factor"
    )
  ),
  row.names = c(NA,-3L),
  class = "data.frame"
)

I also have a comments table structured as follows:

#comments table
comments <- structure(
  list(
    SurveyID = structure(
      1:5,
      .Label = c("ID_1", "ID_2",
                 "ID_3", "ID_4", "ID_5"),
      class = "factor"
    ),
    Open_comments = structure(
      c(2L,
        4L, 3L, 5L, 1L),
      .Label = c(
        "I could never get the pdf to download",
        "I could never get the system to work",
        "I didn’t get the help I needed on time",
        "my questions went unanswered",
        "staying motivated to get through the textbook",
        "there wasn’t enough engagement in the discussion board"
      ),
      class = "factor"
    )
  ),
  class = "data.frame",
  row.names = c(NA,-5L)
)

What I am trying to do:

Search for an exact match keyword. The following working code has been provided by @Len Greski and @Ronak Shah from the previous thread (with huge thanks to both):

resultsList <- lapply(1:ncol(codes),function(x){
     y <- stri_detect_regex(comments$Open_comments,paste(codes[[x]],collapse = "|"))
     ifelse(y == TRUE,1,0)   
     })

results <- as.data.frame(do.call(cbind,resultsList))
colnames(results) <- colnames(codes)
mergedData <- cbind(comments,results)
mergedData

and

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

Both work great but I have come across a snag and now need to match the keywords exactly. As per the example tables above, if I have a keyword "sy", the code will flag any comment with the word "system". I would modify either of the above pieces of code to flag the comment where only "sy" exact match is present.

Many thanks

Keelin
  • 367
  • 1
  • 10
  • 2
    in the second answer,change the paste function to be `paste0("\\b",na.omit(x),"\\b" collapse = "|")` – Onyambu Jun 21 '20 at 07:39
  • I think you need to wrap your codes in `\b`s. – Limey Jun 21 '20 at 07:40
  • Hi @Onyambu thanks so much for the code update, and sincere apologies for the significant delay in response. I had thought it was trying it with codes that include special characters in the string. But turns out its just special characters. I'll start a different thread for that. – Keelin Sep 10 '20 at 02:07

0 Answers0