R - найти, находятся ли символы одного вектора в другом векторе - PullRequest
0 голосов
/ 29 мая 2020

У меня есть сомнения, очень похоже на этот topi c здесь: Найти совпадения вектора строк в другом векторе строк .

У меня есть вектор клиентов, и если имя указывает, что это коммерческий клиент, мне нужно изменить тип в моем data.frame.

Итак, предположим, что:

commercial_names <- c("BAKERY","MARKET", "SCHOOL", "CINEMA")
clients <- c("JOHN XX","REESE YY","BAKERY ZZ","SAMANTHA WW")

Я пробовал код из топи c, упомянутого ранее, но у меня возникла ошибка:

> grepl(paste(commercial_names, collape="|"),clients)
[1] TRUE TRUE TRUE TRUE
Warning message:
In grepl(paste(commercial_names, collape = "|"), clients) :
  argument 'pattern' has length > 1 and only the first element will be used

Что такое Я делаю не так? Буду благодарен за любую помощь.

Ответы [ 4 ]

2 голосов
/ 29 мая 2020

Ваш код правильный, но с опечаткой:

grepl(paste0(commercial_names, collapse = "|"), clients) # typo: collape
[1] FALSE FALSE  TRUE FALSE

Учитывая опечатку, commercial_names не сворачиваются.

1 голос
/ 29 мая 2020

Я нашел другой способ сделать это с помощью команды %like% пакета data.table:

> clients %like% paste(commercial_names,collapse = "|")
[1] FALSE FALSE  TRUE FALSE
1 голос
/ 29 мая 2020

Не уверен, как это сделать с однострочником, но al oop, похоже, помогает.

sapply(clients, function(client) {
  any(str_detect(client, commercial_names))
})
> JOHN XX    REESE YY   BAKERY ZZ SAMANTHA WW 
> FALSE       FALSE        TRUE       FALSE 

0 голосов
/ 29 мая 2020

Вы также можете сделать что-то вроде этого:

clients.first <- gsub(" ..", "", clients)
clients.first %in% commercial_names

Это возвращает:

[1] FALSE FALSE  TRUE FALSE

Вам может потребоваться изменить регулярное выражение для gsub, если данных ваших клиентов больше хотя и неоднородный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...