使用正则表达式在dplyr管道中的@之后提取电子邮件地址,然后使用groupby计算出现次数

时间:2016-08-20 22:04:30

标签: r dplyr

我的数据框中有一个名为email的列。我希望在@符号之后找到电子邮件地址,然后通过例如(gmail,yahoo,hotmail)分组并计算相同的出现次数。

 registrant_email 
 chamukan@yahoo.com     
 tmrsons1974@yahoo.com     
 123ajumohan@gmail.com     
 123@websiterecovery.org     
 salesdesk@2techbrothers.com       
 salesdesk@2techbrothers.com   

现在,我可以使用以下代码

在@之后提取电子邮件
sub(".*@", "", df$registrant_email)

如何在dplyr管道中使用它,然后计算每个电子邮件地址的出现次数

3 个答案:

答案 0 :(得分:2)

tidyr::separate对于拆分列非常有用:

library(tidyr)
library(dplyr)

       # separate email into `user` and `domain` columns
df %>% separate(registrant_email, into = c('user', 'domain'), sep = '@') %>% 
    # tally occurrences for each level of `domain`
    count(domain)

## # A tibble: 4 x 2
##                domain     n
##                 <chr> <int>
## 1   2techbrothers.com     2
## 2           gmail.com     1
## 3 websiterecovery.org     1
## 4           yahoo.com     2

答案 1 :(得分:1)

首先分成字符矩阵,在强制转换为data.frame之后,我们可以使用常见的dplyr成语

library(dplyr)
library(stringr) 

str_split_fixed(df$registrant_email, pattern = "@", n =2) %>%
  data.frame %>% group_by(X2) %>% count(X1)

结果如下

                   X2          X1     n
               <fctr>      <fctr> <int>
1   2techbrothers.com   salesdesk     2
2           gmail.com 123ajumohan     1
3 websiterecovery.org         123     1
4           yahoo.com    chamukan     1
5           yahoo.com tmrsons1974     1

如果要设置变量名以获得更好的代码理解,可以使用

str_split_fixed(df$registrant_email, pattern = "@", n =2) %>%
  data.frame %>% setNames(c("local", "domain")) %>% 
  group_by(domain) %>% count(local)

答案 2 :(得分:1)

我们可以使用base R方法

aggregate(V1~V2, read.table(text = df1$registrant_email, 
          sep="@", stringsAsFactors=FALSE), FUN = length)
#                   V2 V1
#1   2techbrothers.com  2
#2           gmail.com  1
#3 websiterecovery.org  1
#4           yahoo.com  2

或者使用OP的方法并用table

包装
as.data.frame(table(sub(".*@", "", df1$registrant_email)))
#                 Var1 Freq
#1   2techbrothers.com    2
#2           gmail.com    1
#3 websiterecovery.org    1
#4           yahoo.com    2