我的数据框中有一个名为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管道中使用它,然后计算每个电子邮件地址的出现次数
答案 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