#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.