#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
and2. на самом деле иногда данные имеют разные имена имени столбца и адреса электронной почты, поэтому я задал входные параметры для имени и адреса электронной почты в соответствии с именами в данных.
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