Эквивалент data.table для: case_when - Неверное регулярное выражение при использовании электронной почты? - PullRequest
1 голос
/ 29 мая 2020

У меня есть список электронных писем, я хочу сравнить с столбцом БД с именем correo (spani sh для электронной почты).

Итак, допустим, это список электронных писем для использования:

users_emails <-"18maryalma@gmail.com|2013311097@edu.pe|40491118@cotal.edu.pe|956145120jh@gmail.com|975625735o@gmail.com"

При использовании case_when и grepl для сопоставления их с базой данных я получаю:

Error in grepl(users_emails, correo, ignore.case = TRUE) : 
  invalid regular expression '18maryalma@gmail.com|2013311097@edu.pe...

Код:

db <- db %>%
            mutate(
              secciones = case_when(
                grepl(users_emails, 
                      correo, ignore.case = TRUE) ~ TRUE)
              )

данные:

db <- structure(list(idusuario = c(2L, 3L, 6L, 8L, 10L, 11L), ecoid = c(47L, 
1878686L, 355078L, 2667803L, 2680290L, 2680842L), facebookid = c(0, 
0, 0, 0, 0, 0), twitterid = c(0L, 0L, 0L, 0L, 0L, 0L), googleid = c(0L, 
0L, 0L, 0L, 0L, 0L), nombres = c("carlos", "Max", "Estibens Manuel", 
"Hernan", "angie", "Dennys Dante"), apellidos = c("gdrab", "Palomino", 
"' or 1=1", "Galvez", "cotaquispe palomino", "Angeles"), correo = c("cfrasan@gmail.com", 
"maxpalominomendoza@gmail.com", "estibensmanchego@gmail.com", 
"hgb2431@gmail.com", "patito_luz_07@hotmail.com", "dangeles@americatv.com.pe"
), nickname = c("cfrasan666", NA, "estibensmancheg", NA, NA, 
NA), genero = c("M", "M", "M", "M", NA, "M"), avatar = c("http://peruid.e3.pe/ima/0/0/0/0/0/thumb/1338410240_47.jpg", 
"http://peruid.pe/f/i/gadget/avatar-4.jpg", "http://peruid.pe/f/i/gadget/avatar-6.jpg", 
"http://s.elcomercio.pe/uploads/default.jpg", "http://s.elcomercio.pe/uploads/default.jpg", 
"http://s.elcomercio.pe/uploads/default.jpg"), avatar_url = c("http://peruid.e3.pe/ima/0/0/0/0/0/thumb/avatar/1338410240_47.jpg", 
"http://peruid.pe/f/i/gadget/avatar-4.jpg", "http://peruid.pe/f/i/gadget/avatar-6.jpg", 
"http://s.elcomercio.pe/uploads/default.jpg", "http://s.elcomercio.pe/uploads/default.jpg", 
"http://s.elcomercio.pe/uploads/default.jpg"), status = c(0L, 
0L, 0L, 0L, 0L, 0L), fecha = c("1997-03-01", "1986-02-02", "1986-04-22", 
"1984-03-15", "0000-00-00", "1984-05-28"), version = c(34L, 49L, 
99L, 11L, 1L, 2L), pais = c("PE", "PE", "PE", "PE", "PE", "PE"
), suscriptor = c(0L, 0L, 0L, 0L, NA, 0L), telefono = c("95286265", 
"965312230", "014274434", "976926796", NA, "981306661"), ciudad = c("Lima y Callao", 
"Lima y Callao", "Lima y Callao", "Lima y Callao", NA, "Lima"
), acceso = c(NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_), clave = c("sha256:1024:OT9jxBY0cGm+hC3ZQqx+HqE12uAuaqzG:rYTfX", 
"sha256:1024:ddreAcaw8oRPeoE/s5rO/+eMpypBjYyv:MqAYX", "sha256:1024:GqbedkIqtC/ersJvwCPnn78ztIj0CJMR:jOrp+", 
"sha256:1024:7P6+L6h/nQawwFXs9q/Ri9gDzOOstWKk:JwsVX", "sha256:1024:jdrS3ctfG1aa9sNY4csqo/f306T6yyqy:LQtMu", 
"sha256:1024:lbiQYFd668n2E+5zg5bLk0QpeULUJ+Xn:fUtYv"), nueva_clave_key = c(NA, 
"", "2cc9b4cf343011eb94b3cc685f1c91b87f1974db", "", NA, NA), 
    nueva_clave_requested = c(NA, "2016-01-29 17:45:34", "2015-08-02 18:57:44", 
    "2015-07-08 12:30:17", NA, NA), acepto_politicas = c(1L, 
    1L, 1L, 1L, NA, 1L), fecha_registro = c("0000-00-00 00:00:00", 
    "0000-00-00 00:00:00", "0000-00-00 00:00:00", "0000-00-00 00:00:00", 
    "0000-00-00 00:00:00", "0000-00-00 00:00:00"), fecha_actualizado = structure(c(1485147600, 
    1535950800, 1498280400, 1498798800, 1481346000, 1488517200
    ), class = c("POSIXct", "POSIXt"), tzone = ""), dni = c("41764577", 
    "41773997", "44548862", "42311024", "", "42381593"), direccion = c("jose mariategui S/n", 
    "Calle rosacruces 270 San Gregorio are vitarte", "Av. Emancipacion 153 int. 304", 
    "Carlos alayza y roel 2331", "", "Av Jose Leguia y Melendez 1837"
    ), apellido_ma = c("rinjo", "Mendoza", "Melendez", "Bellido", 
    "", "Fuentes"), envio = c("", "", "", "", "", ""), envio_fecha = c("0000-00-00 00:00:00", 
    "0000-00-00 00:00:00", "0000-00-00 00:00:00", "0000-00-00 00:00:00", 
    "0000-00-00 00:00:00", "0000-00-00 00:00:00"), paquete_suscriptor = c("0", 
    "1", "0", "1", "0", "0"), paquete_suscriptor_fecha = c("2016-12-23 12:45:18", 
    "2017-02-16 15:10:37", "0000-00-00 00:00:00", "2016-10-21 10:08:05", 
    "0000-00-00 00:00:00", "0000-00-00 00:00:00"), departamento = c(15L, 
    15L, 15L, 15L, 0L, 15L), provincia = c(6L, 1L, 1L, 1L, 0L, 
    1L), distrito = c(2L, 3L, 1L, 16L, 0L, 21L), ga_userid_is_in_db = c(NA, 
    NA, NA, NA, NA, NA), secciones = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    )), row.names = c(NA, 6L), class = "data.frame")

ОБНОВЛЕНИЕ 1:

По-прежнему возникают ошибки, это были не электронные письма, но также случаются при использовании чисел (в виде строк).

Кто-нибудь знает, как это сделать с таблицей данных?

enter image description here

ОБНОВЛЕНИЕ 2 :

Также должно работать с идентификаторами номеров:

users_ids <- dput(head(users_ids))
c(996683L, 996177L, 994826L, 991164L, 991L, 990744L)

Код:

setDT(db)[Reduce(`|`, lapply(users_ids, function(es)
  grepl(es, idusuario, ignore.case = TRUE))), ga_usersids_in_db := TRUE][]

1 Ответ

1 голос
/ 29 мая 2020

Мы можем использовать fcase из data.table

library(data.table)
setDT(db)[, secciones := fcase(grepl(users_emails, correo, ignore.case = TRUE), TRUE)]

Или без fcase

setDT(db)[grepl(users_emails, correo, ignore.case = TRUE), secciones := TRUE][]

Если писем много, может быть лучше к l oop и Reduce

emails <- strsplit(users_emails, "|", fixed = TRUE)[[1]]
setDT(db)[Reduce(`|`, lapply(emails, function(es)
    grepl(es, correo, ignore.case = TRUE))), secciones := TRUE][]
...