2011-06-16 16 views
5

Quiero dividir una columna que contiene emailadresses en la "@".Columna dividida que contiene las direcciones de correo electrónico

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

No funciona. ¿Cuál es la forma correcta de hacer esto?

+0

¿Es @ un metacarácter para las expresiones regulares? Si es así, es posible que deba precederlo por "\\". Consulte http://127.0.0.1:15646/library/base/html/strsplit.html – Jubbles

+0

O puede que necesite indexar 'unlist' of' strsplit (d $ email, "@") ', p. Ej. 'd $ domain <-unlist (strsplit (d $ email," @ ")) [1]' – Jubbles

Respuesta

2

(Tal vez) más de una línea es necesario:

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

(Nota: d$email debe haber character y no factor y mientras que utilizó 1 como el índice en su pregunta, la el índice de 2 corresponderá al dominio de un correo electrónico)

Actualización: Creo que todavía hay una manera de completar esta tarea en una línea usando 'apply', pero todavía no estoy seguro de cómo hacerlo ...

Una de las respuestas línea (después de definir la función): fn <- function(x){unlist(strsplit(x,"@"))[2]} d$domain <- lapply(d$email, fn)

+0

Gracias pero su comando llena cada columna con la parte de dominio del correo electrónico de la primera fila. ¿Alguna idea de por qué esto podría pasar? – Chris

+0

@Chris: vea la respuesta actualizada más arriba. – Jubbles

+0

gracias! funciona muy bien! – Chris

4

Tiene la idea correcta, pero lo está analizando mal. Prueba esto:

name <- "[email protected]" 
splitname <- strsplit(name, "@") 
emailid <- sapply(splitname, "[", 1) 
domain <- sapply(splitname, "[", 2) 
2

También puede hacer una matriz con una fila para cada mitad de la dirección, así, y seleccionar fácilmente cualquier parte que quería.

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

Puede usar una expresión regular: ¡son divertidos!

d <- data.frame(email=rep([email protected], 10)) 
d$address <- gsub("@.*", "", d$email) 
d$domain <- gsub(".*@", "", d$email) 
6

str_split_fixed del paquete stringr lo hace fácil:

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

Aquí es una función que debe hacerse cargo de la división de los mensajes de correo electrónico para usted. Devuelve una lista con las partes locales y de dominio del correo electrónico.

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)} 
Cuestiones relacionadas