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" <c...@datanalytics.com> Para: "Francisco Javier" <iterado...@hotmail.com> CC: r-help-es@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 <iterado...@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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es _______________________________________________ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es