Использование Grepl для получения точного соответствия, находясь в цикле for

#r #for-loop #grepl

#r #for-цикл #grepl

Вопрос:

У меня возникли проблемы с получением точного соответствия grepl при фильтрации фрейма данных с использованием вектора. Я использую воспроизводимый пример ниже:

 my_vector<-c("Mazda", "Datsun")
my_df<-data.frame(My_vehicles=c("Mazda", "Mazda2", "Mazda3", "Datsun", "Datsun2", "Datsun3"))
 

Если я выполню приведенный ниже код

 grepl("\bMazda\b",my_df$My_vehicles)
 

Я получаю это как результат, который является правильным TRUE FALSE FALSE FALSE FALSE FALSE FALSE

Однако, похоже, я не могу заставить это работать в цикле. Пример ниже

 list_df<-list()
  for (i in 1:length(my_vector))
    
    {  df<-my_df%>%
      filter(grepl(my_vector[i],My_vehicles))
      list_df[[i]]=df
  }
 

Если я изменю

 filter(grepl(my_vector[i],My_vehicles))
 

Для

 filter(grepl("\bmy_vector[i]\b",My_vehicles))
 

Я не получаю правильного результата. Мне нужен список из двух новых фреймов данных, созданных из цикла, каждый из которых должен иметь 1 переменную, для которой он был правильно отфильтрован.

Комментарии:

1. filter(grepl(paste0("\b",my_vector[i],"\b"),My_vehicles))

2. Вы также могли бы сделать filter(grepl(glue::glue("\b{my_vector[i]}\b"),My_vehicles))

3. Спасибо, оба хороших ответа, и они работают

Ответ №1:

Попробуйте это:

 list_df<-list()
for (i in 1:length(my_vector))
{
  df<-my_df%>%
  filter(grepl(paste0("\b",my_vector[i],"\b"),My_vehicles))
  list_df[[i]]=df
}