我想在“@”处拆分包含电子邮件地址的列。
d$domain<-strsplit( d$email, "@")[[1]]
不起作用。这样做的正确方法是什么?
答案 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)}