R — добавить новый столбец на основе частичного совпадения строк из другого столбца

#r #tidyverse

#r #tidyverse

Вопрос:

Я пытаюсь найти способ в tidyverse или через обычный R создать новый столбец, когда часть следующего совпадет. Желаемый результат для моего фрейма данных. Пример: в первой строке в названии кампании использовалось «FB IG», поэтому значение newColumn равно «FB IG»

ID Название кампании Новый столбец
1 001 новая кампания — FB IG — dec FB IG
2 Кампания 002 ноября — BO123- FB — ноябрь FB
3 003 — IG — sep IG

Спасибо

Ответ №1:

Использование поиска регулярных выражений:

 library(dplyr)
library(stringr)
df %>% mutate(newcol = str_extract(`Campaign name`, '(?<=-\s).*(?=\s-)'))
# A tibble: 3 x 3
     id `Campaign name`     newcol 
  <dbl> <chr>               <chr>  
1     1 001 - FB   IG - Dec FB   IG
2     2 002 - FB - Nov      FB     
3     3 003 - IG - Sep      IG     
 

Используемые данные:

 df
# A tibble: 3 x 2
     id `Campaign name`    
  <dbl> <chr>              
1     1 001 - FB   IG - Dec
2     2 002 - FB - Nov     
3     3 003 - IG - Sep     
 

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

1. извините, я должен был добавить, что разделитель может / не может находиться в точном месте, и поэтому может потребоваться поиск строки. Я обновил приведенный выше пример.

Ответ №2:

Для этого мы можем использовать sub from base R

 df1$NewColumn <- trimws(sub(".*-\s*(.*)\s*-.*", "\1", df1$`Campaign name`))
 

-вывод

 df1
#  id                      Campaign name NewColumn
#1  1   001 new campaign - FB   IG - Dec   FB   IG
#2  2 002 nov campaign - BO123- FB - Nov        FB
#3  3                     003 - IG - Sep        IG
 

данные

 df1 <- structure(list(id = 1:3,
    `Campaign name` = c("001 new campaign - FB   IG - Dec", 
  "002 nov campaign - BO123- FB - Nov", "003 - IG - Sep")),
    class = "data.frame", row.names = c(NA, 
 -3L))
 

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

1. извините, я должен был добавить, что разделитель может / не может находиться в точном месте, и поэтому может потребоваться поиск строки. Я обновил приведенный выше пример.

2. @AdilK тот же код должен работать над этим. Я обновил пример

Ответ №3:

Вы можете использовать положительный (?<=-\s) lookbehind и положительный lookahead (?=\s-) , а также класс negated character [^-] , который предотвращает включение - символа в извлечение:

 df1$New <- str_extract(df1$`Campaign name`, "(?<=-\s)[^-] (?=\s-)")