[R-es] Dos pequeños códigos casi idénticos y sólo funciona el primero

Francisco Javier iterador10 en hotmail.com
Vie Nov 25 13:30:51 CET 2016


Hola Carlos y Olivier,


En primer lugar, muchísimas gracias por vuestras respuestas. Siempre estáis ahí para echar un cable y os lo agradezco enormemente.

Resumiendo vuestras contestaciones, la duda planteada puede resolverse en una sóla línea de código:


DT.new <- DT[!(envio == "TRUE" & coche == "B")][envio == "FALSE" & coche == "B", coche := "A"]


Me queda la duda de si lo anterior podría escribirse de alguna forma cuya sintaxis sea más comprensible para

alguien que no es experto en la librería data.table. Es decir, algo del tipo:


DT.new <- DT[ , { Guarda todas las filas con envio=="TRUE" y en que coche != "B"

                        y además (algo del tipo else if)

                        Guarda todas las filas con envio =="FALSE" cambiando coche=="B" por coche=="A" } ]


Muchas gracias.


________________________________
De: Olivier Nuñez <onunez en unex.es>
Enviado: viernes, 25 de noviembre de 2016 10:21
Para: Carlos J. Gil Bellosta
Cc: Francisco Javier; r-help-es en r-project.org
Asunto: Re: [R-es] Dos pequeños códigos casi idénticos y sólo funciona el primero

Creo que el "by" sobra, o me perdí algo?

DT.new=DT[!(envio=="TRUE" & coche=="B"),]
DT.new[(envio=="FALSE" & coche=="B"),coche:="A"]
DT.new
   caso empresa coche envio
1:    1      E1     A  TRUE
2:    1      E1     U  TRUE
3:    2      E2     W FALSE
4:    2      E2     A FALSE


Un saludo. Olivier

----- Mensaje original -----
De: "Carlos J. Gil Bellosta" <cgb en datanalytics.com>
Para: "Francisco Javier" <iterador10 en hotmail.com>
CC: r-help-es en r-project.org
Enviados: Jueves, 24 de Noviembre 2016 16:44:16
Asunto: Re: [R-es]      Dos pequeños códigos casi idénticos y sólo funciona el primero

Hola, ¿qué tal?

¿Has pensado en la posibilidad de que tu código (el que funciona) funcione
solo "de casualidad" y porque tus datos son así y no de otra manera? Tengo
la sensación de que sí.

La lógica es endiablada, y creo que se entiende mejor (y obtienes el mismo
resultado) si haces:

DT[, all.true := all(envio == "TRUE"), by = list(caso, empresa)]
DT <- DT[!(all.true & coche == "B"),]
DT[, all.true := NULL]
DT$coche[DT$coche == "B"] <- "A"
DT

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com

datanalytics - Estadística y análisis de datos<http://www.datanalytics.com/>
www.datanalytics.com
A la hora en que salga publicada esta entrada se estarán inaugurando las VIII Jornadas de Usuarios de R, las… más →




El 24 de noviembre de 2016, 16:21, Francisco Javier <iterador10 en hotmail.com>
escribió:

> Buenas tardes a todos,
>
> He adaptado una pregunta realizada en otro foro respecto de un caso que me
> interesa resolver. Sea el data.table:
>
> DT <- data.table(caso = rep(1:2, c(3, 2)),  empresa = factor(rep(c("E1",
> "E2"), c(3, 2))),
>   coche = factor(c('A', 'B', 'U', 'W', 'B')),  envio = factor(rep(c(T, F),
> c(3, 2))))
>
>
> En el siguiente codigo, segun la dupla (caso, empresa), se eliminan las
> filas coche="B" si envio=T, y se cambia "B" por "A" si envio = F.
>
> DTnew <- DT[,                ##  CODIGO QUE SÍ FUNCIONA
>    if (all(envio == T))  list(coche = coche[which(coche != "B")])
>    else  list(coche),
> by = list(caso, empresa)][, coche :=  as.factor(ifelse(coche == "B", "A",
> as.character(coche))) ]
>
> caso   empresa coche
> 1:   1              E1        A
> 2:   1              E1        U
> 3:   2              E2       W
> 4:   2              E2        A
>
>
> Sin embargo, el siguiente código (casi identico) NO funciona:
>
> DTnew <- DT[,
>    if (all(envio == T))  list(coche = coche[which(coche != "B")])
>    else  list(coche = as.factor(ifelse(coche == "B", "A",
> as.character(coche)))),
> by = list(caso, empresa)]
>
> caso   empresa coche
> 1:   1              E1        A
> 2:   1              E1        U
> 3:   2              E2        B
> 4:   2              E2        A
>
>
> ¿Alguién podría decirme como modificarlo para que sí funcione? Muchas
> gracias por cualquier ayuda.
>
>         [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es

Página de Información de R-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es>
stat.ethz.ch
Esta es una lista de correo para solicitar ayuda sobre R en español y se entiende como un complemento social a la documentación, libros, etc. disponibles sobre R ...



>

        [[alternative HTML version deleted]]

_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es

Página de Información de R-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es>
stat.ethz.ch
Esta es una lista de correo para solicitar ayuda sobre R en español y se entiende como un complemento social a la documentación, libros, etc. disponibles sobre R ...




	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es