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

Olivier Nuñez onunez en unex.es
Vie Nov 25 10:21:16 CET 2016


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

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



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