Reputation: 159
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
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))
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
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