Разделить столбец, содержащий адреса электронной почты - PullRequest
5 голосов
/ 16 июня 2011

Я хочу разбить столбец, содержащий адреса электронной почты, на «@».

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

не работает. Как правильно это сделать?

Ответы [ 6 ]

9 голосов
/ 17 июня 2011

str_split_fixed из пакета stringr делает это простым:

library(stringr)
str_split_fixed(d$email, "@", n = 2)
6 голосов
/ 16 июня 2011

Вы можете использовать регулярное выражение - это весело!

d <- data.frame(email=rep(bob@bob.com, 10))
d$address <- gsub("@.*", "", d$email)
d$domain <- gsub(".*@", "", d$email)
4 голосов
/ 16 июня 2011

У вас правильная идея, но вы просто неправильно ее анализируете. Попробуйте это:

name <- "fakename@email.com"
splitname <- strsplit(name, "@")
emailid <- sapply(splitname, "[", 1)
domain <- sapply(splitname, "[", 2)
2 голосов
/ 16 июня 2011

Вы также можете создать матрицу со строкой для каждой половины адреса, как это, и легко выбрать любую нужную часть.

matrix(unlist(strsplit(name,"@")),nrow=2)
2 голосов
/ 16 июня 2011

(возможно) необходимо более одной строки:

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

(Примечание: d$email должно быть character, а не factor, и хотя вы использовали 1 в качестве индекса в своем вопросе, индекс 2 будет соответствовать домену электронной почты)

Обновление: я думаю, что есть способ завершить эту задачу в одну строку, используя «применить», но я не уверен, как это сделать ... пока.

Ответ в одну строку (после определения функции): fn <- function(x){unlist(strsplit(x,"@"))[2]} d$domain <- lapply(d$email, fn)

0 голосов
/ 26 ноября 2014

Вот функция, которая должна позаботиться о разделении писем для вас. Возвращает список с локальной и доменной частями письма.

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)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...