Как выбрать несколько шаблонов из набора данных в R - PullRequest
0 голосов
/ 28 мая 2019

У меня есть набор данных (данные) со списком идентификаторов электронной почты:

email=c("susgho.agency@gmail.com","suagencyter.m@gmail.com",
        "duff.abcnkhgt@gmail.com","ftyhabcdfg@gmail.com",
        "gjhfhg1-ail.com","gjhgkjhgbrt.gh@aol.com")

У меня есть другой набор данных - (disp) со списком шаблонов:

pattern=c(".agency",".abc","1-ail.com"))

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

email                         pattern
susgho.agency@gmail.com       .agency
suagencyter.m@gmail.com 
duff.abcnkhgt@gmail.com       .abc
ftyhabcdfg@gmail.com    
gjhfhg1-ail.com               1-ail.com
gjhgkjhgbrt.gh@aol.com  

Я использую цикл for, но выполнение выполняется вечно.

w <- NULL
for(i in 1:nrow(disp))
{
  w1 <- as.character(disp[i,1])
  w2 <- data[grep(w1, data$email),]
  if(nrow(w2) > 0)
  {
    w2$pattern <- w1
    w <- rbind(w, w2)
  }
  else
    w <- rbind(w, w2)
}

Любая помощь будет принята с благодарностью.ТИА!

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Вы можете сделать:

df$pattern[max.col(-attr(adist(df2$pattern,df$email,counts = T),'counts')[,,3])] = as.character(df2$pattern)
df
                    email   pattern
1 susgho.agency@gmail.com   .agency
2 suagencyter.m@gmail.com      <NA>
3 duff.abcnkhgt@gmail.com      .abc
4    ftyhabcdfg@gmail.com      <NA>
5         gjhfhg1-ail.com 1-ail.com

или вы можете сделать

merge(df,stack(setNames(Vectorize(grep)(df2$pattern,df,value=T,fixed=T),df2$pattern)),by.x="email",by.y = "values",all=T)
                    email       ind
1 duff.abcnkhgt@gmail.com      .abc
2    ftyhabcdfg@gmail.com      <NA>
3         gjhfhg1-ail.com 1-ail.com
4 suagencyter.m@gmail.com      <NA>
5 susgho.agency@gmail.com   .agency

Данные:

df=read.table(text="email
           susgho.agency@gmail.com
           suagencyter.m@gmail.com
           duff.abcnkhgt@gmail.com
           ftyhabcdfg@gmail.com
           gjhfhg1-ail.com",h=T)

df2=read.table(text=" pattern
              .agency
              .abc
              1-ail.com",h=T)
0 голосов
/ 28 мая 2019

Немного другой подход с использованием stringr::str_match, хотя сначала нужно экранировать специальные символы в строках pattern, добавив префикс двойной обратной косой черты:

email=c("susgho.agency@gmail.com","suagencyter.m@gmail.com",
        "duff.abcnkhgt@gmail.com","ftyhabcdfg@gmail.com",
        "gjhfhg1-ail.com","gjhgkjhgbrt.gh@aol.com")

pattern=c("\\.agency","\\.abc","1\\-ail.com")

data.frame(email, pattern = stringr::str_match(email, paste(pattern, collapse = "|")))

. Это приводит к следующему выводу:

                    email   pattern
1 susgho.agency@gmail.com   .agency
2 suagencyter.m@gmail.com      <NA>
3 duff.abcnkhgt@gmail.com      .abc
4    ftyhabcdfg@gmail.com      <NA>
5         gjhfhg1-ail.com 1-ail.com
6  gjhgkjhgbrt.gh@aol.com      <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...