проверьте, совпадает ли имя с именем в электронной почте

#r

#r

Вопрос:

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

 df <- data.frame(name = c("Nic Hawk","tt dy","anz kpw p","timm ral","Karen Mulc","lew wey","sun mark"),
                 email = c("Nic.Hawk@tttt.com",   "tt.dy@aquan@tttt.com", "anz.kpw.p@tttt.com",   "frez.tal@tttt.com",    "Karen.Mulc@tttt.com",   "lew.wey@tttt.com", "wall.kit@tttt.com"))


Name= "name"
Email="email"
separator = " "

df <- df %>%
  mutate(Name_match = map2_int(str_extract_all(Name, "\w "), 
                               str_extract_all(str_remove(Email, "\@.*"), "\w "),
                               ~  (!all(str_detect(.y, str_c(.x, collapse=" "))))))

df <- df %>%
  separate(Name,
           into = c("last_name", "first_name"),
           sep = separator,
           remove = FALSE) %>%
  mutate(first_name = tolower(first_name),
         last_name = tolower(last_name)) %>%
  mutate(name_email_match = 0L*str_detect(Email,
                                          paste0("^", first_name, separator, last_name,
                                                 "@\w \.com$"))) %>%
  select(-c(first_name, last_name))

 

выходные данные должны представлять собой измененный столбец с 1 и 0 (1 для True (соответствует), 0 для false (не соответствует))

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

1. Я помню, что уже видел у вас вопрос, похожий на этот… Я думаю, вам не совсем понятно, как использовать имена переменных в dplyr. Вам не нужно создавать переменные Name и Email. просто напишите name and email как это есть внутри ваших операторов dplyr 🙂 [даже если это не решит вашу проблему, это повысит качество вашего кода]

2. на самом деле иногда данные имеют разные имена имени столбца и адреса электронной почты, поэтому я задал входные параметры для имени и адреса электронной почты в соответствии с именами в данных.

3. Тогда вы используете его неправильно. Вам нужно написать это так: !!sym(Name) . Я советую переименовать их в самом начале, чтобы вам не приходилось писать !!sym каждый раз.

4. ok обновит это, но мои коды не работают

5. Name =»name» ; Name = !!sym (имя) вот так …??

Ответ №1:

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

 library(dplyr)
library(stringr)

Name  <- "name"
Email <- "email"
separator <- " "

df %>%
 
 # everything to lower
 mutate(across(all_of(c(Name, Email)), tolower)) %>% 
 
 # extract interesting part from email
 mutate(email_name = str_extract(!!sym(Email), "([a-z.] )(?=@. )")) %>% 
 
 # replace . with separator
 mutate(email_name = str_replace_all(email_name, "\.", separator)) %>% 
 
 # compare
 mutate(name_email_match =  (!!sym(Name) == email_name))

#>         name                email email_name name_email_match
#> 1   nic hawk    nic.hawk@tttt.com   nic hawk                1
#> 2      tt dy tt.dy@aquan@tttt.com      tt dy                1
#> 3  anz kpw p   anz.kpw.p@tttt.com  anz kpw p                1
#> 4   timm ral    frez.tal@tttt.com   frez tal                0
#> 5 karen mulc  karen.mulc@tttt.com karen mulc                1
#> 6    lew wey     lew.wey@tttt.com    lew wey                1
#> 7   sun mark    wall.kit@tttt.com   wall kit                0
 

В связи с моим комментарием, если вы хотите переименовать его, чтобы вам не приходилось использовать !!sym(...) каждый раз, вы можете перейти:

 df %>%
 rename(Name  = !!sym(Name),
        Email = !!sym(Email)) %>%
 
 # everything to lower
 mutate(across(c(Name, Email), tolower)) %>% 

 # compare
 mutate(name_email_match =  (str_replace_all(Name, separator, "\.") == 
                              str_extract(Email, "([a-z.] )(?=@. )")))

#>         Name                Email name_email_match
#> 1   nic hawk    nic.hawk@tttt.com                1
#> 2      tt dy tt.dy@aquan@tttt.com                1
#> 3  anz kpw p   anz.kpw.p@tttt.com                1
#> 4   timm ral    frez.tal@tttt.com                0
#> 5 karen mulc  karen.mulc@tttt.com                1
#> 6    lew wey     lew.wey@tttt.com                1
#> 7   sun mark    wall.kit@tttt.com                0
 

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

1. как я могу игнорировать Na и пустые ячейки, если имя столбца или адрес электронной почты являются пробелами или NA

2. Есть несколько способов.. вы можете filter их раньше, например (проверить ?dplyr::filter )

3. если я отфильтрую их, это также повлияет на исходные данные. этого я не хочу

4. В этот момент, если у вас есть NAs в данных, просто вы получите какой-нибудь NAs name_email_match . Вы можете заполнить их нулями. Например, с %>% tidyr::replace_na(list(name_email_match = 0))

Ответ №2:

Работает ли это:

 library(dplyr)
library(stringr)
df %>% mutate(name1 = str_remove_all(name, '\s'), email1 = str_remove(str_remove_all(str_extract(email, '.*(?=@.*)'), '[\.\s]' ), '@.*')) %>% 
   mutate(op =  (str_detect(name1, email1))) %>% select(-c(name1, email1))
        name                email op
1   Nic Hawk    Nic.Hawk@tttt.com  1
2      tt dy tt.dy@aquan@tttt.com  1
3  anz kpw p   anz.kpw.p@tttt.com  1
4   timm ral    frez.tal@tttt.com  0
5 Karen Mulc  Karen.Mulc@tttt.com  1
6    lew wey     lew.wey@tttt.com  1
7   sun mark    wall.kit@tttt.com  0