добавить метку в новый столбец в соответствии с соответствием строки в R - PullRequest
1 голос
/ 08 марта 2019

Я сопоставил строку с 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 Ответ

0 голосов
/ 08 марта 2019

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

...