You can vectorize it with regular expressions, for example. using gsub() :
Set up data:
strings <- c("lorem pear ipsum", "apple ipsum lorem", "lorem ipsum plum") fruit <- c("pear", "apple", "plum")
Now create a regex
ptn <- paste0(".*(", paste(fruit, collapse="|"), ").*") gsub(ptn, "\\1", strings) [1] "pear" "apple" "plum"
A regular expression works by dividing each search item into | embedded in parentheses:
ptn [1] ".*(pear|apple|plum).*"
To do this inside a data table, according to your question, it will be as simple as:
library(data.table) DT <- data.table(name=strings, value=c(4, 2, 6)) DT[, factor:=gsub(ptn, "\\1", strings)] DT name value factor 1: lorem pear ipsum 4 pear 2: apple ipsum lorem 2 apple 3: lorem ipsum plum 6 plum
source share