R中的列表或数据集中的变异内的str_replace

问题描述

我想在另一个数据集的基础上将字符添加到数据集的行中。因此,我有两个数据集,一个称为电子邮件,另一个称为域。我的问题是电子邮件数据集缺少将用户名与域名分开的@字符,因此我需要根据域数据集添加它。

这是我的两个数据集:

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]

但是,我希望能够以一种不需要我将每个电子邮件地址剪切并粘贴到mutatestr_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(.,"@")}))