[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