Francisco Javier
2016-Nov-24 15:21 UTC
[R-es] Dos pequeños códigos casi idénticos y sólo funciona el primero
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]]
Carlos J. Gil Bellosta
2016-Nov-24 15:44 UTC
[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]]
Olivier Nuñez
2016-Nov-25 09:21 UTC
[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 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