добавьте метку в новый столбец в соответствии с совпадением строк в R

#r #filter #dplyr #stringr

#r #Фильтр #dplyr #stringr

Вопрос:

Я выполнил сопоставление строк с str_detect из stringr и отфильтровал данные моего df в соответствии с ними.

df

    variable x y z
      AN    B C D
      EF    F G H
  

Код является:

 df_filtered <- df %>% filter(str_detect(variable, paste(dict, collapse="|")))
  

«dict» — это мой список слов (вектор символов), которые я хочу обнаружить в моем фрейме данных.

       dict
       A
       C
       D
       G
  

и я получил:

    variable x y z
      AN    B C D
  

я хочу добавить новый столбец для каждой извлеченной строки, содержащий элемент dict, который соответствует.

    variable x y z dict
      AN    B C D  A
  

как я могу сделать?

Ответ №1:

В случае, если вы можете быть уверены, что в строке есть только одна запись 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.