【问题标题】:clean the email column in dataframe清理数据框中的电子邮件列
【发布时间】:2020-08-27 17:21:17
【问题描述】:

我有一个如下所示的数据框

df <- data.frame(email=c("abc@gmail.com","def@gmail.com","ghi@gmail.com","jkl@gmail.com","mno@gmail.com","pqr@hotmail.com","st@u@live.com","vwx@gmail.com","yza@gmail.com","a.a.b@gmail.c.om",
                   "aac@gmail.com","abb@gmail.com","abc@gmail.com","cab@gmailcom","dfc@gmail.com"))

现在我想在以下情况下清理此列:所以我正在尝试创建一个这样的检查,我可以添加比这 4 个更多的检查...

  1. 检查电子邮件是否缺少点“。”
  2. 检查电子邮件是否有多个“@”
  3. 检查电子邮件是否有多个“.” “@”之前和“@”之后
  4. 检查域中是否有除“gmail.com”之外的其他邮件,例如(hotmail.com、live.com)等等......

所以输出应该等于....这样我就可以检查来决定删除或更新什么

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用dplyrstringr 的一种方法。我将您的第三张支票分成两列。

    library(tidyverse)
    library(stringr)
    
    d <- df %>% 
      mutate(missing_dots = as.numeric(str_detect(email, "\\.", negate = TRUE)),
             more_than_1_at = as.numeric(str_detect(email, ".*@.*@.*|@{2,}")),
             more_than_1_dot_before = as.numeric(str_detect(email, ".*\\..*\\..*@.*")),
             more_than_1_dot_after = as.numeric(str_detect(email, ".*@.*\\..*\\..*")),
             no_gmail = as.numeric(str_detect(email, "@gmail.com", negate = TRUE)))
            
    
    

    【讨论】:

      【解决方案2】:

      您可以使用dplyrstringr 的组合来执行此操作。请注意,我不确定您想对点进行计数,因此我在 @ 之前和之后创建了列数。

      library(dplyr)
      library(stringr)
      df %>% 
        mutate(missing_dots = as.numeric(!str_detect(.$email, "\\.")),
        more_1_at = str_count(.$email, "@")-1, 
        dots_before = str_count(str_extract(.$email, ".*@"), "\\."), 
        dots_after = str_count(str_extract(.$email, "@.*"), "\\."), 
        from_gmail = as.numeric(str_detect(.$email, "gmail\\.com")))
      #               email missing_dots more_1_at dots_before dots_after from_gmail
      # 1     abc@gmail.com            0         0           0          1          1
      # 2     def@gmail.com            0         0           0          1          1
      # 3     ghi@gmail.com            0         0           0          1          1
      # 4     jkl@gmail.com            0         0           0          1          1
      # 5     mno@gmail.com            0         0           0          1          1
      # 6   pqr@hotmail.com            0         0           0          1          0
      # 7     st@u@live.com            0         1           0          1          0
      # 8     vwx@gmail.com            0         0           0          1          1
      # 9     yza@gmail.com            0         0           0          1          1
      # 10 a.a.b@gmail.c.om            0         0           2          2          0
      # 11    aac@gmail.com            0         0           0          1          1
      # 12    abb@gmail.com            0         0           0          1          1
      # 13    abc@gmail.com            0         0           0          1          1
      # 14     cab@gmailcom            1         0           0          0          0
      # 15    dfc@gmail.com            0         0           0          1          1
      

      【讨论】:

        【解决方案3】:

        您可以使用grepl匹配变体,使用ifelse分配10

        df$missing_dot <- ifelse(grepl("\\wcom", df$email), 1, 0)
        df$more_than_1at <- ifelse(grepl("@.*@", df$email), 1,0)
        df$more_than_1. <- ifelse(grepl("\\..*\\.", df$email), 1,0)
        

        要包含包含域名的列,您可以使用sub和反向引用\\1

        df$domain <- sub(".*@(.*)$", "\\1", df$email)
        

        结果:

            df
                      email missing_dot more_than_1at more_than_1.      domain
        1     abc@gmail.com           0             0            0   gmail.com
        2     def@gmail.com           0             0            0   gmail.com
        3     ghi@gmail.com           0             0            0   gmail.com
        4     jkl@gmail.com           0             0            0   gmail.com
        5     mno@gmail.com           0             0            0   gmail.com
        6   pqr@hotmail.com           0             0            0 hotmail.com
        7     st@u@live.com           0             1            0    live.com
        8     vwx@gmail.com           0             0            0   gmail.com
        9     yza@gmail.com           0             0            0   gmail.com
        10 a.a.b@gmail.c.om           0             0            1  gmail.c.om
        11    aac@gmail.com           0             0            0   gmail.com
        12    abb@gmail.com           0             0            0   gmail.com
        13    abc@gmail.com           0             0            0   gmail.com
        14     cab@gmailcom           1             0            0    gmailcom
        15    dfc@gmail.com           0             0            0   gmail.com
        

        或者,如果您希望 01 用于 gmail v.其他域,您可以这样做:

        ifelse(grepl("gmail", df$email), 0, 1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-12
          • 2011-09-17
          • 1970-01-01
          • 2021-12-12
          • 1970-01-01
          • 2017-11-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多