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

Carlos J. Gil Bellosta cgb en datanalytics.com
Sab Nov 26 18:04:44 CET 2016


Hola, ¿qué tal?

Respondo debajo:

El 25 de noviembre de 2016, 10:21, Olivier Nuñez <onunez en unex.es> escribió:

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


Bueno, en el código original había un

all(envio == T)

dentro de un grupo "by". Entiendo que la lógica que seguía aplicaba solo si
todos los envíos por caso/empresa fuesen T. En el ejemplo mostrado daba
igual (¿accidente de los datos?); pero en el general, entiendo, no.

Un saludo,

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


>
> 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
>
> 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
> >
>
>         [[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
>

	[[alternative HTML version deleted]]



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