【问题标题】:str_replace within a mutate over a list or a dataset in R在 R 中的列表或数据集上的变异中的 str_replace
【发布时间】:2020-08-18 13:09:41
【问题描述】:

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

这是我的两个数据集:

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", "@gmail.com"),
         email =  str_replace(email, "ymail.com", "@ymail.com"),
         email =  str_replace(email, "hsne.com", "@hsne.com"),
         email =  str_replace(email, "raveis.com", "@raveis.com"))

结果:

# A tibble: 4 x 1
  email                       
  <chr>                       
1 tjoeblog@ymail.com      
2 simonsays@gmail.com  
3 realpeople@hsne.com      
4 funnythings@raveis.com

但是,我希望能够以一种不需要将每个电子邮件地址剪切并粘贴到 mutatestr_replace 的方式来执行此操作,而是使用 map 或 @ 987654330@ 函数,不知道怎么做。任何建议/帮助将不胜感激。

【问题讨论】:

    标签: r str-replace purrr dplyr


    【解决方案1】:

    您可以将所有域粘贴到一个字符串中并使用str_replace_all

    library(stringr)
    str_replace_all(emails$email, str_c(domains$domain, collapse = "|"), 
              function(m) paste0('@', m))
    
    #[1] "tjoeblog@ymail.com"     "simonsays@gmail.com"    "realpeople@hsne.com"   
    #      "funnythings@raveis.com"
    

    domains 数据集中的“hhsne.com”中删除了一个额外的“h”。

    【讨论】:

      【解决方案2】:

      使用映射函数遍历您的域

      library(tidyverse)
      emails %>% 
        mutate(email = map_chr(domains$domain, ~{str_replace(email, 
                                                             .x, 
                                                             paste0("@", .x)) %>% 
        str_subset(., "@")})) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        相关资源
        最近更新 更多