Patricio Fuenmayor Viteri
2015-Jan-27 16:05 UTC
[R-es] trabajar con todos los elementos de la fila de un data.table
Hola a todos...Auxilio, estoy varado en esto y creo que mi terquedad no me deja avanzar ... terquedad ya que estoy usando la estructura data.table y no logro obtener el resultado. Tengo una DT contiene un DATO y los resultados de la aplicación de una validación (ERR01, ERR2, ERR3) y la concatenación de estos errores en una sola columna. Si tiene error, graba el número del error, si no lo tiene, graba NA. Utilizando la función paste directamente en el DT se ontiene la variable LISTA: DATO ERR1 ERR2 ERR3 LISTAAAA 1 2 3 1|2|3BBB NA 2 3 NA|2|3CCC NA NA 3 NA|NA|3DDD NA NA NA NA|NA|NA Pero lo que se requiere es que el NA no se muestre, es decir lista debería tener elementos como: 1|2|3, 2|3, 3, y vacío, si las 3 validaciones arrojaron NA.uso lo siguiente: DT[,lista:=paste(err1,err1,err3,sep="|")] pero para quitar los NA, debo usar funciones como na.omit, y no logro crear la estructura para usarlo... que debe ser un na,omit(c(err1,err2,err3)) y sobre esto el paste.Supongo que tengo un lío en uso de las estructuras ... Si no lo logro, toca trabajar con data.frames y dejar a aun lado mi terquedad...!!! Gracias por cualquier ayuda y/o sugerencia. [[alternative HTML version deleted]]
Olivier Nuñez
2015-Jan-28 09:00 UTC
[R-es] trabajar con todos los elementos de la fila de un data.table
Utiliza "collapse" en vez de "sep" dentro de la función paste(). Un ejemplo:> DT=data.table(ID=1:4,ERR1=c(1,1,NA,NA),ERR2=c(NA,2,2,NA),ERR3=c(3,3,3,NA)) > DTID ERR1 ERR2 ERR3 1: 1 1 NA 3 2: 2 1 2 3 3: 3 NA 2 3 4: 4 NA NA NA> DT[,lista:=paste(na.omit(c(ERR1,ERR2,ERR3)),collapse="|"),by=ID] > DTID ERR1 ERR2 ERR3 lista 1: 1 1 NA 3 1|3 2: 2 1 2 3 1|2|3 3: 3 NA 2 3 2|3 4: 4 NA NA NA>----- Mensaje original ----- De: "Patricio Fuenmayor Viteri" <patricio.fuenmayor en outlook.com> Para: "r-help-es" <r-help-es en r-project.org> Enviados: Martes, 27 de Enero 2015 17:05:23 Asunto: [R-es] trabajar con todos los elementos de la fila de un data.table Hola a todos...Auxilio, estoy varado en esto y creo que mi terquedad no me deja avanzar ... terquedad ya que estoy usando la estructura data.table y no logro obtener el resultado. Tengo una DT contiene un DATO y los resultados de la aplicaci?n de una validaci?n (ERR01, ERR2, ERR3) y la concatenaci?n de estos errores en una sola columna. Si tiene error, graba el n?mero del error, si no lo tiene, graba NA. Utilizando la funci?n paste directamente en el DT se ontiene la variable LISTA: DATO ERR1 ERR2 ERR3 LISTAAAA 1 2 3 1|2|3BBB NA 2 3 NA|2|3CCC NA NA 3 NA|NA|3DDD NA NA NA NA|NA|NA Pero lo que se requiere es que el NA no se muestre, es decir lista deber?a tener elementos como: 1|2|3, 2|3, 3, y vac?o, si las 3 validaciones arrojaron NA.uso lo siguiente: DT[,lista:=paste(err1,err1,err3,sep="|")] pero para quitar los NA, debo usar funciones como na.omit, y no logro crear la estructura para usarlo... que debe ser un na,omit(c(err1,err2,err3)) y sobre esto el paste.Supongo que tengo un l?o en uso de las estructuras ... Si no lo logro, toca trabajar con data.frames y dejar a aun lado mi terquedad...!!! Gracias por cualquier ayuda y/o sugerencia. [[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
Olivier Nuñez
2015-Jan-28 16:41 UTC
[R-es] trabajar con todos los elementos de la fila de un data.table
Cocinando de manera más o menos elegante, se obtiene algo más eficiente:> require(data.table) > n=10000 > DT=data.table(ID=1:(4*n),ERR1=rep(c(1,1,NA,NA),n),ERR2=rep(c(NA,2,2,NA),n),ERR3=rep(c(3,3,3,NA),n)) > system.time(DT[,lista:=paste(na.omit(c(ERR1,ERR2,ERR3)),collapse="|"),by=ID])user system elapsed 0.71 0.00 0.72> > > DT2=data.table(ERR1=rep(c(1,1,NA,NA),n),ERR2=rep(c(NA,2,2,NA),n),ERR3=rep(c(3,3,3,NA),n)) > system.time(+ DT2[,lista:=gsub("\\|$","",gsub("NA|","",paste0(paste(ERR1,ERR2,ERR3,sep="|"),"|"),fixed=TRUE))] + ) user system elapsed 0.11 0.00 0.11 ----- Mensaje original ----- De: "Patricio Fuenmayor Viteri" <patricio.fuenmayor en outlook.com> Para: "Olivier Nuñez" <onunez en unex.es> Enviados: Miércoles, 28 de Enero 2015 16:15:32 Asunto: RE: [R-es] trabajar con todos los elementos de la fila de un data.table Gracias ....!!! Exactamente lo que quería... estaba cerca ... !!! Ahora me pregunto... hay una forma mas eficiente de hacer esto ??? mi duda surge ya que mi proceso de validación tarda 3 veces menos que este "etiquetamiento" de los errores ... y pensaría que debería ser al contrario porque solo estoy juntando valores y poniéndoles una condición una vez mas gracias ... !!!> Date: Wed, 28 Jan 2015 10:00:59 +0100 > From: onunez en unex.es > To: patricio.fuenmayor en outlook.com > CC: r-help-es en r-project.org > Subject: Re: [R-es] trabajar con todos los elementos de la fila de un data.table > > Utiliza "collapse" en vez de "sep" dentro de la función paste(). > Un ejemplo: > > > DT=data.table(ID=1:4,ERR1=c(1,1,NA,NA),ERR2=c(NA,2,2,NA),ERR3=c(3,3,3,NA)) > > DT > ID ERR1 ERR2 ERR3 > 1: 1 1 NA 3 > 2: 2 1 2 3 > 3: 3 NA 2 3 > 4: 4 NA NA NA > > DT[,lista:=paste(na.omit(c(ERR1,ERR2,ERR3)),collapse="|"),by=ID] > > DT > ID ERR1 ERR2 ERR3 lista > 1: 1 1 NA 3 1|3 > 2: 2 1 2 3 1|2|3 > 3: 3 NA 2 3 2|3 > 4: 4 NA NA NA > > > > > ----- Mensaje original ----- > De: "Patricio Fuenmayor Viteri" <patricio.fuenmayor en outlook.com> > Para: "r-help-es" <r-help-es en r-project.org> > Enviados: Martes, 27 de Enero 2015 17:05:23 > Asunto: [R-es] trabajar con todos los elementos de la fila de un data.table > > Hola a todos...Auxilio, estoy varado en esto y creo que mi terquedad no me deja avanzar ... terquedad ya que estoy usando la estructura data.table y no logro obtener el resultado. Tengo una DT contiene un DATO y los resultados de la aplicaci?n de una validaci?n (ERR01, ERR2, ERR3) y la concatenaci?n de estos errores en una sola columna. Si tiene error, graba el n?mero del error, si no lo tiene, graba NA. Utilizando la funci?n paste directamente en el DT se ontiene la variable LISTA: > DATO ERR1 ERR2 ERR3 LISTAAAA 1 2 3 1|2|3BBB NA 2 3 NA|2|3CCC NA NA 3 NA|NA|3DDD NA NA NA NA|NA|NA > Pero lo que se requiere es que el NA no se muestre, es decir lista deber?a tener elementos como: 1|2|3, 2|3, 3, y vac?o, si las 3 validaciones arrojaron NA.uso lo siguiente: > DT[,lista:=paste(err1,err1,err3,sep="|")] > pero para quitar los NA, debo usar funciones como na.omit, y no logro crear la estructura para usarlo... que debe ser un na,omit(c(err1,err2,err3)) y sobre esto el paste.Supongo que tengo un l?o en uso de las estructuras ... Si no lo logro, toca trabajar con data.frames y dejar a aun lado mi terquedad...!!! > Gracias por cualquier ayuda y/o sugerencia. > > > > [[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]]
Hola a todos, a ver si me pueden echar una mano que estoy atascado.tengo estas dos tablas:> head (intento1) codigo categoria talla num1 1 904 400 12 1 904 460 13 1 904 470 44 1 904 480 105 1 904 490 36 1 904 500 13 > head (intento2) codigo categoría ratio1 1 904 68.992 1 905 60.263 1 906 53.864 1 907 16.435 1 908 5.076 1 909 5.95Pues bien, quiero colocar la variable de intento2 "ratio" en intento1, de forma que en todas las tallas de la categoría 904 de intento1 salga el ratio 68.99, en todas las tallas de la categoria 905 salga 60.26, etc.Muchas gracias [[alternative HTML version deleted]]