Если вы можете быть уверены, что в каждой строке есть только одна запись dict , код довольно прост.
library(tidyverse)
dict <- c("a", "c", "d", "g")
# I create a random dataframe
(df <- tibble(variable = stringi::stri_rand_strings(1000, 3, pattern = "[a-z]")))
# A tibble: 1,000 x 1
variable
<chr>
1 tmx
2 rgq
3 pkm
4 tue
5 wet
6 slx
7 lkq
8 std
9 ivu
10 vyt
# ... with 990 more rows
# I map your dict list to the dataframe
(df_out <- map_df(dict, ~ filter(df, str_detect(variable, .x)) %>%
mutate(out = str_extract(variable, .x))))
# A tibble: 437 x 2
variable out
<chr> <chr>
1 rar a
2 cam a
3 kba a
4 wax a
5 zta a
6 aep a
7 wao a
8 bga a
9 auv a
10 bea a
# ... with 427 more rows
# Merge all dict-hits per entry
(df_out <- df_out %>%
nest(out, .key = "out") %>%
mutate(out = map_chr(out, ~ str_c(.x$out, collapse = "_"))))
# A tibble: 379 x 2
variable out
<chr> <chr>
1 rar a
2 cam a_c
3 kba a
4 wax a
5 zta a
6 aep a
7 wao a
8 bga a_g
9 auv a
10 bea a
# ... with 369 more rows
[решено редактированием] ЕслиВы запускаете этот код с более чем одной dict записью на строку, код будет генерировать одну строку на dict hit.