拆分包含电子邮件地址的列

时间:2011-06-16 16:49:09

标签: r

我想在“@”处拆分包含电子邮件地址的列。

d$domain<-strsplit( d$email, "@")[[1]]

不起作用。这样做的正确方法是什么?

6 个答案:

答案 0 :(得分:9)

来自str_split_fixed包的

stringr使这一切变得简单:

library(stringr)
str_split_fixed(d$email, "@", n = 2)

答案 1 :(得分:6)

你可以使用正则表达式 - 它们很有趣!

d <- data.frame(email=rep(bob@bob.com, 10))
d$address <- gsub("@.*", "", d$email)
d$domain <- gsub(".*@", "", d$email)

答案 2 :(得分:4)

你有正确的想法,但你只是解析它错了。试试这个:

name <- "fakename@email.com"
splitname <- strsplit(name, "@")
emailid <- sapply(splitname, "[", 1)
domain <- sapply(splitname, "[", 2)

答案 3 :(得分:2)

(也许)需要不止一行:

for (i in 1:length(row.names(d)){    
d$domain[i]<-unlist(strsplit( d$email[i], "@"))[2]
}

(注意:d$email必须是character而不是factor,当您在问题中使用1作为索引时,索引2将对应于电子邮件的域名)

更新:我认为仍有一种方法可以通过使用'apply'在一行中完成此任务,但我不知道如何做到这一点......但是。

一行答案(定义功能后): fn <- function(x){unlist(strsplit(x,"@"))[2]} d$domain <- lapply(d$email, fn)

答案 4 :(得分:2)

您也可以为地址的每一半创建一个带有行的矩阵,就像这样,并轻松选择您想要的任何部分。

matrix(unlist(strsplit(name,"@")),nrow=2)

答案 5 :(得分:0)

这是一个应该为您分割电子邮件的功能。它返回包含电子邮件的本地和域部分的列表。

parse.email <- function(emails) {
email.list <- strsplit(emails, split = '@')
# Preallocate the vectors
n <- length(email.list)
local <-  vector(length = n)
domain <-  vector(length = n)
for (i in 1:n){
    local[i] <- email.list[[i]][1]
    domain[i] <- email.list[[i]][2]
}
l <- list(local, domain)
names(l) <- c('local', 'domain')
return(l)}