Мне понравился ответ cholland (+1), но вы также можете использовать tidytext::unnest_tokens()
, это будет проще, если я собираюсь иметь более шести слов.
Сначала выможет создать отображение df:
mapped <- rbind (data.frame(word_a = stocks, type = "stock", stringsAsFactors = F),
data.frame(word_a = climate, type = "climate", stringsAsFactors = F),
data.frame(word_a = cuisine, type = "cuisine", stringsAsFactors = F))
Теперь вы можете использовать упомянутую функцию, чтобы получить пару неопубликованных df для достижения цели:
library(tidytext)
library(stringr)
library(tidyverse)
mapped <- mapped %>% unnest_tokens(word, word_a)
df %>%
unnest_tokens(word, keywords) %>% # split words
left_join(mapped) %>% # join to map
group_by(id) %>% # group
summarise(keywords = str_c(unique(type), collapse = ",")) # collapse the word (unique)
# A tibble: 2 x 2
id keywords
<dbl> <chr>
1 1 stock,climate,cuisine
2 2 cuisine,climate
Обратите внимание, что во второй строке есть перевернутые словавместо ожидаемого результата из-за того, что они в указанном порядке являются соответствующими словами в первом df
.
С данными:
df <- data.frame(id = c(1,2), keywords = c("google, yahoo, air, cookie", "cookie, air"), stringsAsFactors = F)
stocks <- c("google, yahoo")
climate <- c("air")
cuisine <- c("cookie")