Quiero ver cuántas direcciones de correo electrónico contienen el apellido del propietario del correo electrónico.

Cada fila en un marco de datos contiene un apellido y una dirección de correo electrónico. Quiero agregar una tercera columna con un "sí" o un "no" que indique la presencia del apellido en el correo electrónico en esa fila.

Usar un bucle for funciona bien ... pero no puedo evitar pensar que probablemente haya una mejor solución R. ¿Alguna sugerencia sobre cómo hacer esto más elegante?

vec1 <- c("foo", "smith")
vec2 <- c("sfoo@x.com", "xxx@y.com")

df <- data.frame(vec1,vec2)


for(i in 1:nrow(df)) {
  if (grepl(df$vec1[i], df$vec2[i]) == TRUE) {
    df$lastNameInEmail[i] <- "Yes"
  } else {
    df$lastNameInEmail[i] <- "No"
  }
}

   vec1       vec2 lastNameInEmail
1   foo sfoo@x.com             Yes
2 smith  xxx@y.com              No
3
Mike N 17 sep. 2018 a las 16:27

3 respuestas

La mejor respuesta

Puedes usar stringr str_detect

stringr::str_detect(vec2,paste(vec1,collapse = '|'))
[1]  TRUE FALSE
4
YOBEN_S 17 sep. 2018 a las 13:34

Aquí hay una alternativa data.table que funciona para más de las dos filas dadas:

vec1 <- c("foo", "smith", "jones", "bar")
vec2 <- c("sfoo@x.com", "xxx@y.com", "yyy@x.com", "sbar@x.com")

df <- data.frame(vec1,vec2)

library(data.table)
dt <- data.table(df)
dt[, lastNameInEmail:=ifelse(grepl(vec1, vec2) == TRUE, "Yes", "No"), by=vec1]
dt
    vec1       vec2 lastNameInEmail
1:   foo sfoo@x.com             Yes
2: smith  xxx@y.com              No
3: jones  yyy@x.com              No
4:   bar sbar@x.com             Yes

Sin embargo, esto supone que la columna vec1 es única.

1
makeyourownmaker 17 sep. 2018 a las 16:09

Aquí hay una versión que usa funciones base R que funciona para más de las dos filas dadas:

vec1 <- c("foo", "smith", "jones", "bar")
vec2 <- c("sfoo@x.com", "xxx@y.com", "yyy@x.com", "sbar@x.com")

df <- data.frame(vec1,vec2)

df$lastNameInEmail <- sapply(1:nrow(df), function(x){ifelse(grepl(df$vec1[x], df$vec2[x])==TRUE, "Yes", "No")})
df
    vec1       vec2 lastNameInEmail
1:   foo sfoo@x.com             Yes
2: smith  xxx@y.com              No
3: jones  yyy@x.com              No
4:   bar sbar@x.com             Yes
1
makeyourownmaker 17 sep. 2018 a las 16:09