#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-)")