问题描述
我想在另一个数据集的基础上将字符添加到数据集的行中。因此,我有两个数据集,一个称为电子邮件,另一个称为域。我的问题是电子邮件数据集缺少将用户名与域名分开的@字符,因此我需要根据域数据集添加它。
这是我的两个数据集:
emails<-c("tjoeblogymail.com","simonsaysgmail.com","realpeoplehsne.com","funnythingsraveis.com") %>%
as_tibble() %>% rename(email = value)
这将导致:
# A tibble: 4 x 1
email
<chr>
1 tjoeblogymail.com
2 simonsaysgmail.com
3 realpeoplehsne.com
4 funnythingsraveis.com
域:
domains<-c("ymail.com","gmail.com","hhsne.com","raveis.com") %>%
as_tibble() %>% rename(domain = value)
这将导致:
# A tibble: 4 x 1
domain
<chr>
1 ymail.com
2 gmail.com
3 hhsne.com
4 raveis.com
我想在域之前的字符串中添加@符号。目前,我可以按以下步骤逐一进行操作:
emails %>%
mutate(email = str_replace(email,"@gmail.com"),email = str_replace(email,"ymail.com","@ymail.com"),"hsne.com","@hsne.com"),"raveis.com","@raveis.com"))
这将导致:
# A tibble: 4 x 1
email
<chr>
1 [email protected]
2 [email protected]
3 [email protected]
4 [email protected]
但是,我希望能够以一种不需要我将每个电子邮件地址剪切并粘贴到mutate
和str_replace
中的方式来执行此操作,而是使用{ {1}}或map
起作用,无法弄清楚该怎么做。任何建议/帮助将不胜感激。
解决方法
您可以将所有域粘贴到一个字符串中,然后使用str_replace_all
library(stringr)
str_replace_all(emails$email,str_c(domains$domain,collapse = "|"),function(m) paste0('@',m))
#[1] "[email protected]" "[email protected]" "[email protected]"
# "[email protected]"
从domains
数据集中的“ hhsne.com”中删除了一个额外的“ h”。
使用地图功能遍历您的域
library(tidyverse)
emails %>%
mutate(email = map_chr(domains$domain,~{str_replace(email,.x,paste0("@",.x)) %>%
str_subset(.,"@")}))