Hola, ¿qué tal? Respondo debajo:
El 25 de noviembre de 2016, 10:21, Olivier Nuñez <[email protected]> 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" <[email protected]> > Para: "Francisco Javier" <[email protected]> > CC: [email protected] > 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 < > [email protected]> > 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 > > [email protected] > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > [email protected] > https://stat.ethz.ch/mailman/listinfo/r-help-es > [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list [email protected] https://stat.ethz.ch/mailman/listinfo/r-help-es
