user11015000
user11015000

Reputation: 159

search for word/phrase from column in R

I have data that looks like this:

> head(df)
  ID                                                 Comment
1  1                                            I ate dinner.
2  2                              We had a three-course meal.
3  3                             Brad came to dinner with us.
4  4                                     He loves fish tacos.
5  5  In the end, we all felt like we ate too much. Code 5.16
6  6   We all agreed; it was a magnificent evening.72 points.

I want to create two new columns, one called A and one called B. I want column A to equal 1 if any of the following words/phrases occur: dinner,evening,we ate I want column B to equal 1 if any of the following words/phrases occur: in the end,all,Brad,5.16.

How can I go about doing this? Mind you I need an exact match.

Upvotes: 1

Views: 434

Answers (2)

akrun
akrun

Reputation: 887193

We can use grepl in base R

df$A <- +(grepl("\\b(dinner|evening|we|ate)\\b", df$Comment))
df$B <- +(grepl("\\b(in the end|all|Brad|5\\.16)\\b", df$Comment))

-output

df
  ID                                                 Comment A B
1  1                                           I ate dinner. 1 0
2  2                             We had a three-course meal. 0 0
3  3                            Brad came to dinner with us. 1 1
4  4                                    He loves fish tacos. 0 0
5  5 In the end, we all felt like we ate too much. Code 5.16 1 1
6  6  We all agreed; it was a magnificent evening.72 points. 1 1

NOTE: The pattern can be created with paste as well

v1 <- c("dinner", "evening", "we", "ate")
v2 <- c("in the end", "all", "Brad", "5.16")
pat1 <- paste0("\\b(", paste(v1, collapse = "|"), ")\\b")
pat2 <- paste0("\\b(", paste(v2, collapse = "|"), ")\\b")
df$A <- +(grepl(pat1, df$Comment))
df$B <- +(grepl(pat2, df$Comment))

data

df <- structure(list(ID = 1:6, Comment = c("I ate dinner.", "We had a three-course meal.", 
"Brad came to dinner with us.", "He loves fish tacos.", "In the end, we all felt like we ate too much. Code 5.16", 
"We all agreed; it was a magnificent evening.72 points.")),
 class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

Upvotes: 2

Karthik S
Karthik S

Reputation: 11584

Does this work:

library(dplyr)
library(stringr)

df %>% mutate(A = +str_detect(Comment,str_c(c('dinner','evening','we ate'), collapse = '|')),
              B = +str_detect(Comment,str_c(c('in the end','all','Brad','5.16'), collapse = '|')))
# A tibble: 6 x 4
     ID Comment                                                     A     B
  <dbl> <chr>                                                   <int> <int>
1     1 I ate dinner.                                               1     0
2     2 We had a three-course meal.                                 0     0
3     3 Brad came to dinner with us.                                1     1
4     4 He loves fish tacos.                                        0     0
5     5 In the end, we all felt like we ate too much. Code 5.16     1     1
6     6 We all agreed; it was a magnificent evening.72 points       1     1

Upvotes: 1

Related Questions