Sebastian Kruk
2012-Mar-09 16:04 UTC
[R-es] unir 2 dataframe con con igual caso pero distinto valor en igual variable
Estimados usarios de R: Tengo una base de datos madre en formato .sav de SPSS y la quiero modificar usando datos de otras base de datos .sav y otra en .csv a las que llamare hijos. No tengo problema en convertirlas en data.frame. Todos los archivos tienen en común una variable que es única. En aquellos casos que les falta un valor a una variable en el archivo madre lo relleno con el valor del mismo caso que lo tengo en el archivo hijos. El comando merge no me permite hacer lo anterior. ¿Hay alguno más avanzado? El archivo madre es mas corto que cualquiera de los archivos hijos. Un extracto del archivo madre: Dia Mes Año Nombre Apellido Clase 1 1981 Juan Perez A 2 2 1981 Maria Paz B 2 Pedro García B 3 3 1981 José Lugano C 1 1 1982 José Lugano C Un extracto de un archivo hijo: Dia Mes Año Nombre Apellido Clase 1 1 1981 Juan Perez A 3 2 1981 Maria Paz B 1 2 1982 Pedro García B 1 1 1983 José Lugano C 1 2 1984 Juan Paz B 2 2 1985 Maria García B 2 2 1984 Pedro Lugano C 2 2 1984 José Lugano A 2 2 1981 Juan Perez B 2 2 1981 Maria Paz C 2 3 1984 Pedro García A 3 3 1987 José Lugano C 3 3 1990 Juan Paz B 3 3 1993 Maria García B 3 3 1996 Pedro Lugano A 3 4 1999 José Lugano C 3 4 2002 Juan Paz C 4 4 2005 Maria García B Las variables clave son Nombre, Apellido y Clase. Los casos que aparecen en en los archivos hijos distintos del madre no interesan. Si hay un NA en el archivo madre y no es NA en el archivo hijo le pongo el valor del archivo hijo. Si el valor en el archivo madre no es NA pero es distinto del valor que aparece en el archivo hijo queda el valor del archivo madre. Desde ya les agradezco la ayuda. Saludos, Sebastián.
Marcuzzi, Javier Rubén
2012-Mar-09 16:34 UTC
[R-es] unir 2 dataframe con con igual caso pero distinto valor enigual variable
Hola Sebastian Kruk Yo tuve que mezclar datos provenientes de distintos lugares, en mi caso, llevé los archivos a un data.frame por archivo, trabaje acomodando los data.frame para que queden "iguales" en otros data.frame, digamos los originales eran DatosA y DatosB, la versión acomodada era DatosAA y DatosBB. Un punto importante que en mi caso producía errores era el no ordenar los datos. Una vez que tenía todo ordenado con NA, y etc., utilizaba el "merge". Por las dudas, al crear DatossAA y DatosBB tenía una columna que en todos los valores decía AA o BB, de esta forma tenía indicado el origen de los datos. Luego pude continuar trabajando con mi nuevo data.frame fruto del merge. Me resulta muy difícil imaginar lo que ocurre en su caso, ¿tiene una identificación única, etc? Recomendación, si no le molesta ejecutar ?merge y enviarnos un ejemplo con su caso, como está en la ayuda de R, por lo menos para mí es más fácil entender y poder indicarle algo, no se si la solución pero ... Javier -----Mensaje original----- From: Sebastian Kruk Sent: Friday, March 09, 2012 1:04 PM To: r-help-es en r-project.org Subject: [R-es] unir 2 dataframe con con igual caso pero distinto valor enigual variable Estimados usarios de R: Tengo una base de datos madre en formato .sav de SPSS y la quiero modificar usando datos de otras base de datos .sav y otra en .csv a las que llamare hijos. No tengo problema en convertirlas en data.frame. Todos los archivos tienen en común una variable que es única. En aquellos casos que les falta un valor a una variable en el archivo madre lo relleno con el valor del mismo caso que lo tengo en el archivo hijos. El comando merge no me permite hacer lo anterior. ¿Hay alguno más avanzado? El archivo madre es mas corto que cualquiera de los archivos hijos. Un extracto del archivo madre: Dia Mes Año Nombre Apellido Clase 1 1981 Juan Perez A 2 2 1981 Maria Paz B 2 Pedro García B 3 3 1981 José Lugano C 1 1 1982 José Lugano C Un extracto de un archivo hijo: Dia Mes Año Nombre Apellido Clase 1 1 1981 Juan Perez A 3 2 1981 Maria Paz B 1 2 1982 Pedro García B 1 1 1983 José Lugano C 1 2 1984 Juan Paz B 2 2 1985 Maria García B 2 2 1984 Pedro Lugano C 2 2 1984 José Lugano A 2 2 1981 Juan Perez B 2 2 1981 Maria Paz C 2 3 1984 Pedro García A 3 3 1987 José Lugano C 3 3 1990 Juan Paz B 3 3 1993 Maria García B 3 3 1996 Pedro Lugano A 3 4 1999 José Lugano C 3 4 2002 Juan Paz C 4 4 2005 Maria García B Las variables clave son Nombre, Apellido y Clase. Los casos que aparecen en en los archivos hijos distintos del madre no interesan. Si hay un NA en el archivo madre y no es NA en el archivo hijo le pongo el valor del archivo hijo. Si el valor en el archivo madre no es NA pero es distinto del valor que aparece en el archivo hijo queda el valor del archivo madre. Desde ya les agradezco la ayuda. Saludos, Sebastián. _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Carlos Ortega
2012-Mar-09 22:04 UTC
[R-es] unir 2 dataframe con con igual caso pero distinto valor en igual variable
Hola Sebastian, Mira si este código resuelve el problema que planteas. Primero utilizo merge, pero para ello agrupo el campo clave (Nombre, Apellido y Clase) en un sólo string. Junto "madre" e "hijo" por este campo y luego busco los NA que tiene la parte de la "madre" para poner los del "hijo" como quieres (es el bucle). Y finalmente, deshago lo que agrupé al principio Nombre-Apellido-Clase. Para que esto funcione, es imprescindible que el fichero "madre" lo obtengas separado por ";" o vaya, los campos que faltan que los puedas extraer de SPSS completándolos con "NA". #################################################### Lin.mad<-"Dia;Mes;Año;Nombre;Apellido;Clase 1;;1981;Juan;Perez;A 2;2;1981;Maria;Paz;B 2;;;Pedro;García;B 3;3;1981;José;Lugano;C 1;1;1982;José;Lugano;C " mad.df <- read.table(textConnection(Lin.mad), header=T, as.is = TRUE, na.strings="NA", sep=";") Lin.hij<-"Dia Mes Año Nombre Apellido Clase 1 1 1981 Juan Perez A 3 2 1981 Maria Paz B 1 2 1982 Pedro García B 1 1 1983 José Lugano C 1 2 1984 Juan Paz B 2 2 1985 Maria García B 2 2 1984 Pedro Lugano C 2 2 1984 José Lugano A 2 2 1981 Juan Perez B 2 2 1981 Maria Paz C 2 3 1984 Pedro García A 3 3 1987 José Lugano C 3 3 1990 Juan Paz B 3 3 1993 Maria García B 3 3 1996 Pedro Lugano A 3 4 1999 José Lugano C 3 4 2002 Juan Paz C 4 4 2005 Maria García B " hij.df <- read.table(textConnection(Lin.hij), header=T, as.is = TRUE, na.strings="NA") mad.df.new<-data.frame( Dia=mad.df$Dia, Mes=mad.df$Mes, Año=mad.df$Año, NAC=paste(mad.df$Nombre,mad.df$Apellido,mad.df$Clase,sep="-") ) hij.df.new<-data.frame( Dia=hij.df$Dia, Mes=hij.df$Mes, Año=hij.df$Año, NAC=paste(hij.df$Nombre,hij.df$Apellido,hij.df$Clase,sep="-") ) com.madre<-merge(hij.df.new,mad.df.new, by.x=4, by.y=4, all.x=F, all.y=T) #com.tmp<-com.madre for(i in 1:dim(com.madre)[1]) { if(is.na(com.madre$Dia.y[i])) com.madre$Dia.y[i]<-com.madre$Dia.x[i] else com.madre$Dia.y[i]<-com.madre$Dia.y[i] if(is.na(com.madre$Mes.y[i])) com.madre$Mes.y[i]<-com.madre$Mes.x[i] else com.madre$Mes.y[i]<-com.madre$Mes.y[i] if(is.na(com.madre$Año.y[i])) com.madre$Año.y[i]<-com.madre$Año.x[i] else com.madre$Año.y[i]<-com.madre$Año.y[i] } v.tmp<-read.table(text=as.character(com.madre$NAC), sep="-") com.madre.fin<-data.frame( Dia=com.madre$Dia.y, Mes=com.madre$Mes.y, Año=com.madre$Año.y, Nombre=v.tmp$V1, Apellido=v.tmp$V2, Clase=v.tmp$V3 ) #################################################### Saludos, Carlos Ortega www.qualityexcellence.es El 9 de marzo de 2012 17:04, Sebastian Kruk <residuo.solow@gmail.com>escribió:> Estimados usarios de R: > > Tengo una base de datos madre en formato .sav de SPSS y la quiero > modificar usando datos de otras base de datos .sav y otra en .csv a > las que llamare hijos. > > No tengo problema en convertirlas en data.frame. > > Todos los archivos tienen en común una variable que es única. > > En aquellos casos que les falta un valor a una variable en el archivo > madre lo relleno con el valor del mismo caso que lo tengo en el > archivo hijos. > > El comando merge no me permite hacer lo anterior. ¿Hay alguno más avanzado? > > El archivo madre es mas corto que cualquiera de los archivos hijos. > > Un extracto del archivo madre: > > Dia Mes Año Nombre Apellido Clase > 1 1981 Juan Perez A > 2 2 1981 Maria Paz B > 2 Pedro García B > 3 3 1981 José Lugano C > 1 1 1982 José Lugano C > > Un extracto de un archivo hijo: > > Dia Mes Año Nombre Apellido Clase > 1 1 1981 Juan Perez A > 3 2 1981 Maria Paz B > 1 2 1982 Pedro García B > 1 1 1983 José Lugano C > 1 2 1984 Juan Paz B > 2 2 1985 Maria García B > 2 2 1984 Pedro Lugano C > 2 2 1984 José Lugano A > 2 2 1981 Juan Perez B > 2 2 1981 Maria Paz C > 2 3 1984 Pedro García A > 3 3 1987 José Lugano C > 3 3 1990 Juan Paz B > 3 3 1993 Maria García B > 3 3 1996 Pedro Lugano A > 3 4 1999 José Lugano C > 3 4 2002 Juan Paz C > 4 4 2005 Maria García B > > Las variables clave son Nombre, Apellido y Clase. > > Los casos que aparecen en en los archivos hijos distintos del madre no > interesan. > > Si hay un NA en el archivo madre y no es NA en el archivo hijo le > pongo el valor del archivo hijo. > > Si el valor en el archivo madre no es NA pero es distinto del valor > que aparece en el archivo hijo queda el valor del archivo madre. > > Desde ya les agradezco la ayuda. > > Saludos, > > Sebastián. > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Sebastian Kruk
2012-Mar-10 16:08 UTC
[R-es] unir 2 dataframe con con igual caso pero distinto valor en igual variable
Carlos, muchas gracias. Me funcionó tu solución. Me faltó un detalle, yo tengo varios archivos hijos y en varios de ellos tengo valores para agregar, ¿como hago? Saludos, Sebastián. El día 9 de marzo de 2012 20:04, Carlos Ortega <cof en qualityexcellence.es> escribió:> Hola Sebastian, > > Mira si este código resuelve el problema que planteas. > Primero utilizo merge, pero para ello agrupo el campo clave (Nombre, > Apellido y Clase) en un sólo string. Junto "madre" e "hijo" por este campo y > luego busco los NA que tiene la parte de la "madre" para poner los del > "hijo" como quieres (es el bucle). > Y finalmente, deshago lo que agrupé al principio Nombre-Apellido-Clase. > > Para que esto funcione, es imprescindible que el fichero "madre" lo obtengas > separado por ";" o vaya, los campos que faltan que los puedas extraer de > SPSS completándolos con "NA". > > #################################################### > > Lin.mad<-"Dia;Mes;Año;Nombre;Apellido;Clase > 1;;1981;Juan;Perez;A > 2;2;1981;Maria;Paz;B > 2;;;Pedro;García;B > 3;3;1981;José;Lugano;C > 1;1;1982;José;Lugano;C > " > > mad.df <- read.table(textConnection(Lin.mad), header=T, as.is = TRUE, > na.strings="NA", sep=";") > > > Lin.hij<-"Dia Mes Año Nombre Apellido Clase > 1 1 1981 Juan Perez A > 3 2 1981 Maria Paz B > 1 2 1982 Pedro García B > 1 1 1983 José Lugano C > 1 2 1984 Juan Paz B > 2 2 1985 Maria García B > 2 2 1984 Pedro Lugano C > 2 2 1984 José Lugano A > 2 2 1981 Juan Perez B > 2 2 1981 Maria Paz C > 2 3 1984 Pedro García A > 3 3 1987 José Lugano C > 3 3 1990 Juan Paz B > 3 3 1993 Maria García B > 3 3 1996 Pedro Lugano A > 3 4 1999 José Lugano C > 3 4 2002 Juan Paz C > 4 4 2005 Maria García B > " > > > hij.df <- read.table(textConnection(Lin.hij), header=T, as.is = TRUE, > na.strings="NA") > > > mad.df.new<-data.frame( > Dia=mad.df$Dia, > Mes=mad.df$Mes, > Año=mad.df$Año, > NAC=paste(mad.df$Nombre,mad.df$Apellido,mad.df$Clase,sep="-") > ) > > hij.df.new<-data.frame( > Dia=hij.df$Dia, > Mes=hij.df$Mes, > Año=hij.df$Año, > NAC=paste(hij.df$Nombre,hij.df$Apellido,hij.df$Clase,sep="-") > ) > > > com.madre<-merge(hij.df.new,mad.df.new, by.x=4, by.y=4, all.x=F, all.y=T) > #com.tmp<-com.madre > > for(i in 1:dim(com.madre)[1]) { > > if(is.na(com.madre$Dia.y[i])) > com.madre$Dia.y[i]<-com.madre$Dia.x[i] > else com.madre$Dia.y[i]<-com.madre$Dia.y[i] > > if(is.na(com.madre$Mes.y[i])) > com.madre$Mes.y[i]<-com.madre$Mes.x[i] > else com.madre$Mes.y[i]<-com.madre$Mes.y[i] > > if(is.na(com.madre$Año.y[i])) > com.madre$Año.y[i]<-com.madre$Año.x[i] > else com.madre$Año.y[i]<-com.madre$Año.y[i] > > } > > v.tmp<-read.table(text=as.character(com.madre$NAC), sep="-") > > com.madre.fin<-data.frame( > Dia=com.madre$Dia.y, > Mes=com.madre$Mes.y, > Año=com.madre$Año.y, > Nombre=v.tmp$V1, > Apellido=v.tmp$V2, > Clase=v.tmp$V3 > ) > > #################################################### > > > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 9 de marzo de 2012 17:04, Sebastian Kruk <residuo.solow en gmail.com> > escribió: >> >> Estimados usarios de R: >> >> Tengo una base de datos madre en formato .sav de SPSS y la quiero >> modificar usando datos de otras base de datos .sav y otra en .csv a >> las que llamare hijos. >> >> No tengo problema en convertirlas en data.frame. >> >> Todos los archivos tienen en común una variable que es única. >> >> En aquellos casos que les falta un valor a una variable en el archivo >> madre lo relleno con el valor del mismo caso que lo tengo en el >> archivo hijos. >> >> El comando merge no me permite hacer lo anterior. ¿Hay alguno más >> avanzado? >> >> El archivo madre es mas corto que cualquiera de los archivos hijos. >> >> Un extracto del archivo madre: >> >> Dia Mes Año Nombre Apellido Clase >> 1 1981 Juan Perez A >> 2 2 1981 Maria Paz B >> 2 Pedro García B >> 3 3 1981 José Lugano C >> 1 1 1982 José Lugano C >> >> Un extracto de un archivo hijo: >> >> Dia Mes Año Nombre Apellido Clase >> 1 1 1981 Juan Perez A >> 3 2 1981 Maria Paz B >> 1 2 1982 Pedro García B >> 1 1 1983 José Lugano C >> 1 2 1984 Juan Paz B >> 2 2 1985 Maria García B >> 2 2 1984 Pedro Lugano C >> 2 2 1984 José Lugano A >> 2 2 1981 Juan Perez B >> 2 2 1981 Maria Paz C >> 2 3 1984 Pedro García A >> 3 3 1987 José Lugano C >> 3 3 1990 Juan Paz B >> 3 3 1993 Maria García B >> 3 3 1996 Pedro Lugano A >> 3 4 1999 José Lugano C >> 3 4 2002 Juan Paz C >> 4 4 2005 Maria García B >> >> Las variables clave son Nombre, Apellido y Clase. >> >> Los casos que aparecen en en los archivos hijos distintos del madre no >> interesan. >> >> Si hay un NA en el archivo madre y no es NA en el archivo hijo le >> pongo el valor del archivo hijo. >> >> Si el valor en el archivo madre no es NA pero es distinto del valor >> que aparece en el archivo hijo queda el valor del archivo madre. >> >> Desde ya les agradezco la ayuda. >> >> Saludos, >> >> Sebastián. >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es
Carlos Ortega
2012-Mar-10 16:48 UTC
[R-es] unir 2 dataframe con con igual caso pero distinto valor en igual variable
Hola, No entiendo muy bien la duda que planteas. El problema que tenías era que algunos casos de los ficheros "madre" no existían y los tenías que cruzar con el fichero "hijo" para conseguirlos. Ahora lo que comentas es que..¿tienes varios ficheros hijos? ¿Cada hijo tiene su fichero madre asociado con el que cruzar?. Vaya, el trabajo de cruzar un fichero madre con un hijo, lo puedes convertir en una función para que coja los ficheros de un directorio y devuelva como resultado un fichero cruzado con los casos comunes y completos. Si puedes dar más detalles del problema... Saludos, Carlos Ortega www.qualityexcellence.es El 10 de marzo de 2012 17:08, Sebastian Kruk <residuo.solow@gmail.com>escribió:> Carlos, muchas gracias. Me funcionó tu solución. > > Me faltó un detalle, yo tengo varios archivos hijos y en varios de > ellos tengo valores para agregar, ¿como hago? > > Saludos, > > Sebastián. > > El día 9 de marzo de 2012 20:04, Carlos Ortega > <cof@qualityexcellence.es> escribió: > > Hola Sebastian, > > > > Mira si este código resuelve el problema que planteas. > > Primero utilizo merge, pero para ello agrupo el campo clave (Nombre, > > Apellido y Clase) en un sólo string. Junto "madre" e "hijo" por este > campo y > > luego busco los NA que tiene la parte de la "madre" para poner los del > > "hijo" como quieres (es el bucle). > > Y finalmente, deshago lo que agrupé al principio Nombre-Apellido-Clase. > > > > Para que esto funcione, es imprescindible que el fichero "madre" lo > obtengas > > separado por ";" o vaya, los campos que faltan que los puedas extraer de > > SPSS completándolos con "NA". > > > > #################################################### > > > > Lin.mad<-"Dia;Mes;Año;Nombre;Apellido;Clase > > 1;;1981;Juan;Perez;A > > 2;2;1981;Maria;Paz;B > > 2;;;Pedro;García;B > > 3;3;1981;José;Lugano;C > > 1;1;1982;José;Lugano;C > > " > > > > mad.df <- read.table(textConnection(Lin.mad), header=T, as.is = TRUE, > > na.strings="NA", sep=";") > > > > > > Lin.hij<-"Dia Mes Año Nombre Apellido Clase > > 1 1 1981 Juan Perez A > > 3 2 1981 Maria Paz B > > 1 2 1982 Pedro García B > > 1 1 1983 José Lugano C > > 1 2 1984 Juan Paz B > > 2 2 1985 Maria García B > > 2 2 1984 Pedro Lugano C > > 2 2 1984 José Lugano A > > 2 2 1981 Juan Perez B > > 2 2 1981 Maria Paz C > > 2 3 1984 Pedro García A > > 3 3 1987 José Lugano C > > 3 3 1990 Juan Paz B > > 3 3 1993 Maria García B > > 3 3 1996 Pedro Lugano A > > 3 4 1999 José Lugano C > > 3 4 2002 Juan Paz C > > 4 4 2005 Maria García B > > " > > > > > > hij.df <- read.table(textConnection(Lin.hij), header=T, as.is = TRUE, > > na.strings="NA") > > > > > > mad.df.new<-data.frame( > > Dia=mad.df$Dia, > > Mes=mad.df$Mes, > > Año=mad.df$Año, > > NAC=paste(mad.df$Nombre,mad.df$Apellido,mad.df$Clase,sep="-") > > ) > > > > hij.df.new<-data.frame( > > Dia=hij.df$Dia, > > Mes=hij.df$Mes, > > Año=hij.df$Año, > > NAC=paste(hij.df$Nombre,hij.df$Apellido,hij.df$Clase,sep="-") > > ) > > > > > > com.madre<-merge(hij.df.new,mad.df.new, by.x=4, by.y=4, all.x=F, all.y=T) > > #com.tmp<-com.madre > > > > for(i in 1:dim(com.madre)[1]) { > > > > if(is.na(com.madre$Dia.y[i])) > > com.madre$Dia.y[i]<-com.madre$Dia.x[i] > > else com.madre$Dia.y[i]<-com.madre$Dia.y[i] > > > > if(is.na(com.madre$Mes.y[i])) > > com.madre$Mes.y[i]<-com.madre$Mes.x[i] > > else com.madre$Mes.y[i]<-com.madre$Mes.y[i] > > > > if(is.na(com.madre$Año.y[i])) > > com.madre$Año.y[i]<-com.madre$Año.x[i] > > else com.madre$Año.y[i]<-com.madre$Año.y[i] > > > > } > > > > v.tmp<-read.table(text=as.character(com.madre$NAC), sep="-") > > > > com.madre.fin<-data.frame( > > Dia=com.madre$Dia.y, > > Mes=com.madre$Mes.y, > > Año=com.madre$Año.y, > > Nombre=v.tmp$V1, > > Apellido=v.tmp$V2, > > Clase=v.tmp$V3 > > ) > > > > #################################################### > > > > > > > > Saludos, > > Carlos Ortega > > www.qualityexcellence.es > > > > El 9 de marzo de 2012 17:04, Sebastian Kruk <residuo.solow@gmail.com> > > escribió: > >> > >> Estimados usarios de R: > >> > >> Tengo una base de datos madre en formato .sav de SPSS y la quiero > >> modificar usando datos de otras base de datos .sav y otra en .csv a > >> las que llamare hijos. > >> > >> No tengo problema en convertirlas en data.frame. > >> > >> Todos los archivos tienen en común una variable que es única. > >> > >> En aquellos casos que les falta un valor a una variable en el archivo > >> madre lo relleno con el valor del mismo caso que lo tengo en el > >> archivo hijos. > >> > >> El comando merge no me permite hacer lo anterior. ¿Hay alguno más > >> avanzado? > >> > >> El archivo madre es mas corto que cualquiera de los archivos hijos. > >> > >> Un extracto del archivo madre: > >> > >> Dia Mes Año Nombre Apellido Clase > >> 1 1981 Juan Perez A > >> 2 2 1981 Maria Paz B > >> 2 Pedro García B > >> 3 3 1981 José Lugano C > >> 1 1 1982 José Lugano C > >> > >> Un extracto de un archivo hijo: > >> > >> Dia Mes Año Nombre Apellido Clase > >> 1 1 1981 Juan Perez A > >> 3 2 1981 Maria Paz B > >> 1 2 1982 Pedro García B > >> 1 1 1983 José Lugano C > >> 1 2 1984 Juan Paz B > >> 2 2 1985 Maria García B > >> 2 2 1984 Pedro Lugano C > >> 2 2 1984 José Lugano A > >> 2 2 1981 Juan Perez B > >> 2 2 1981 Maria Paz C > >> 2 3 1984 Pedro García A > >> 3 3 1987 José Lugano C > >> 3 3 1990 Juan Paz B > >> 3 3 1993 Maria García B > >> 3 3 1996 Pedro Lugano A > >> 3 4 1999 José Lugano C > >> 3 4 2002 Juan Paz C > >> 4 4 2005 Maria García B > >> > >> Las variables clave son Nombre, Apellido y Clase. > >> > >> Los casos que aparecen en en los archivos hijos distintos del madre no > >> interesan. > >> > >> Si hay un NA en el archivo madre y no es NA en el archivo hijo le > >> pongo el valor del archivo hijo. > >> > >> Si el valor en el archivo madre no es NA pero es distinto del valor > >> que aparece en el archivo hijo queda el valor del archivo madre. > >> > >> Desde ya les agradezco la ayuda. > >> > >> Saludos, > >> > >> Sebastián. > >> > >> _______________________________________________ > >> R-help-es mailing list > >> R-help-es@r-project.org > >> https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > > > > > -- > > Saludos, > > Carlos Ortega > > www.qualityexcellence.es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Sebastian Kruk
2012-Mar-10 17:03 UTC
[R-es] unir 2 dataframe con con igual caso pero distinto valor en igual variable
Hola, tengo varios ficheros hijos. Por lo cual me interesaria en el caso que tengan valores distintos conservarlos todos. El día 10 de marzo de 2012 14:48, Carlos Ortega <cof en qualityexcellence.es> escribió:> Hola, > > No entiendo muy bien la duda que planteas. > El problema que tenías era que algunos casos de los ficheros "madre" no > existían y los tenías que cruzar con el fichero "hijo" para conseguirlos. > > Ahora lo que comentas es que..¿tienes varios ficheros hijos? ¿Cada hijo > tiene su fichero madre asociado con el que cruzar?. > > Vaya, el trabajo de cruzar un fichero madre con un hijo, lo puedes convertir > en una función para que coja los ficheros de un directorio y devuelva como > resultado un fichero cruzado con los casos comunes y completos. > > Si puedes dar más detalles del problema... > > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 10 de marzo de 2012 17:08, Sebastian Kruk <residuo.solow en gmail.com> > escribió: > >> Carlos, muchas gracias. Me funcionó tu solución. >> >> Me faltó un detalle, yo tengo varios archivos hijos y en varios de >> ellos tengo valores para agregar, ¿como hago? >> >> Saludos, >> >> Sebastián. >> >> El día 9 de marzo de 2012 20:04, Carlos Ortega >> <cof en qualityexcellence.es> escribió: >> > Hola Sebastian, >> > >> > Mira si este código resuelve el problema que planteas. >> > Primero utilizo merge, pero para ello agrupo el campo clave (Nombre, >> > Apellido y Clase) en un sólo string. Junto "madre" e "hijo" por este >> > campo y >> > luego busco los NA que tiene la parte de la "madre" para poner los del >> > "hijo" como quieres (es el bucle). >> > Y finalmente, deshago lo que agrupé al principio Nombre-Apellido-Clase. >> > >> > Para que esto funcione, es imprescindible que el fichero "madre" lo >> > obtengas >> > separado por ";" o vaya, los campos que faltan que los puedas extraer de >> > SPSS completándolos con "NA". >> > >> > #################################################### >> > >> > Lin.mad<-"Dia;Mes;Año;Nombre;Apellido;Clase >> > 1;;1981;Juan;Perez;A >> > 2;2;1981;Maria;Paz;B >> > 2;;;Pedro;García;B >> > 3;3;1981;José;Lugano;C >> > 1;1;1982;José;Lugano;C >> > " >> > >> > mad.df <- read.table(textConnection(Lin.mad), header=T, as.is = TRUE, >> > na.strings="NA", sep=";") >> > >> > >> > Lin.hij<-"Dia Mes Año Nombre Apellido Clase >> > 1 1 1981 Juan Perez A >> > 3 2 1981 Maria Paz B >> > 1 2 1982 Pedro García B >> > 1 1 1983 José Lugano C >> > 1 2 1984 Juan Paz B >> > 2 2 1985 Maria García B >> > 2 2 1984 Pedro Lugano C >> > 2 2 1984 José Lugano A >> > 2 2 1981 Juan Perez B >> > 2 2 1981 Maria Paz C >> > 2 3 1984 Pedro García A >> > 3 3 1987 José Lugano C >> > 3 3 1990 Juan Paz B >> > 3 3 1993 Maria García B >> > 3 3 1996 Pedro Lugano A >> > 3 4 1999 José Lugano C >> > 3 4 2002 Juan Paz C >> > 4 4 2005 Maria García B >> > " >> > >> > >> > hij.df <- read.table(textConnection(Lin.hij), header=T, as.is = TRUE, >> > na.strings="NA") >> > >> > >> > mad.df.new<-data.frame( >> > Dia=mad.df$Dia, >> > Mes=mad.df$Mes, >> > Año=mad.df$Año, >> > >> > NAC=paste(mad.df$Nombre,mad.df$Apellido,mad.df$Clase,sep="-") >> > ) >> > >> > hij.df.new<-data.frame( >> > Dia=hij.df$Dia, >> > Mes=hij.df$Mes, >> > Año=hij.df$Año, >> > >> > NAC=paste(hij.df$Nombre,hij.df$Apellido,hij.df$Clase,sep="-") >> > ) >> > >> > >> > com.madre<-merge(hij.df.new,mad.df.new, by.x=4, by.y=4, all.x=F, >> > all.y=T) >> > #com.tmp<-com.madre >> > >> > for(i in 1:dim(com.madre)[1]) { >> > >> > if(is.na(com.madre$Dia.y[i])) >> > com.madre$Dia.y[i]<-com.madre$Dia.x[i] >> > else com.madre$Dia.y[i]<-com.madre$Dia.y[i] >> > >> > if(is.na(com.madre$Mes.y[i])) >> > com.madre$Mes.y[i]<-com.madre$Mes.x[i] >> > else com.madre$Mes.y[i]<-com.madre$Mes.y[i] >> > >> > if(is.na(com.madre$Año.y[i])) >> > com.madre$Año.y[i]<-com.madre$Año.x[i] >> > else com.madre$Año.y[i]<-com.madre$Año.y[i] >> > >> > } >> > >> > v.tmp<-read.table(text=as.character(com.madre$NAC), sep="-") >> > >> > com.madre.fin<-data.frame( >> > Dia=com.madre$Dia.y, >> > Mes=com.madre$Mes.y, >> > Año=com.madre$Año.y, >> > Nombre=v.tmp$V1, >> > Apellido=v.tmp$V2, >> > Clase=v.tmp$V3 >> > ) >> > >> > #################################################### >> > >> > >> > >> > Saludos, >> > Carlos Ortega >> > www.qualityexcellence.es >> > >> > El 9 de marzo de 2012 17:04, Sebastian Kruk <residuo.solow en gmail.com> >> > escribió: >> >> >> >> Estimados usarios de R: >> >> >> >> Tengo una base de datos madre en formato .sav de SPSS y la quiero >> >> modificar usando datos de otras base de datos .sav y otra en .csv a >> >> las que llamare hijos. >> >> >> >> No tengo problema en convertirlas en data.frame. >> >> >> >> Todos los archivos tienen en común una variable que es única. >> >> >> >> En aquellos casos que les falta un valor a una variable en el archivo >> >> madre lo relleno con el valor del mismo caso que lo tengo en el >> >> archivo hijos. >> >> >> >> El comando merge no me permite hacer lo anterior. ¿Hay alguno más >> >> avanzado? >> >> >> >> El archivo madre es mas corto que cualquiera de los archivos hijos. >> >> >> >> Un extracto del archivo madre: >> >> >> >> Dia Mes Año Nombre Apellido Clase >> >> 1 1981 Juan Perez A >> >> 2 2 1981 Maria Paz B >> >> 2 Pedro García B >> >> 3 3 1981 José Lugano C >> >> 1 1 1982 José Lugano C >> >> >> >> Un extracto de un archivo hijo: >> >> >> >> Dia Mes Año Nombre Apellido Clase >> >> 1 1 1981 Juan Perez A >> >> 3 2 1981 Maria Paz B >> >> 1 2 1982 Pedro García B >> >> 1 1 1983 José Lugano C >> >> 1 2 1984 Juan Paz B >> >> 2 2 1985 Maria García B >> >> 2 2 1984 Pedro Lugano C >> >> 2 2 1984 José Lugano A >> >> 2 2 1981 Juan Perez B >> >> 2 2 1981 Maria Paz C >> >> 2 3 1984 Pedro García A >> >> 3 3 1987 José Lugano C >> >> 3 3 1990 Juan Paz B >> >> 3 3 1993 Maria García B >> >> 3 3 1996 Pedro Lugano A >> >> 3 4 1999 José Lugano C >> >> 3 4 2002 Juan Paz C >> >> 4 4 2005 Maria García B >> >> >> >> Las variables clave son Nombre, Apellido y Clase. >> >> >> >> Los casos que aparecen en en los archivos hijos distintos del madre no >> >> interesan. >> >> >> >> Si hay un NA en el archivo madre y no es NA en el archivo hijo le >> >> pongo el valor del archivo hijo. >> >> >> >> Si el valor en el archivo madre no es NA pero es distinto del valor >> >> que aparece en el archivo hijo queda el valor del archivo madre. >> >> >> >> Desde ya les agradezco la ayuda. >> >> >> >> Saludos, >> >> >> >> Sebastián. >> >> >> >> _______________________________________________ >> >> R-help-es mailing list >> >> R-help-es en r-project.org >> >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> > >> > >> > >> > >> > -- >> > Saludos, >> > Carlos Ortega >> > www.qualityexcellence.es > > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es
Carlos Ortega
2012-Mar-10 17:23 UTC
[R-es] unir 2 dataframe con con igual caso pero distinto valor en igual variable
Hola, Si tienes varios ficheros hijos y quieres conservar todos los registros que sean distintos se me ocurre lo siguiente, siguiendo la idea que usé para juntar Nombre-Apellido-Clase: 1. Juntaría todos los ficheros hijos en uno solo (todos los registros en un gran data.frame: Lees el fichero, lo guardas en un data.frame temporal, lees otro nuevo y lo añades al temporal y así con todos... 2. Uniría todas las columnas, separadas con el "-". Así tendría un data.frame con una sola columna (Mes-Dia-Año-Nombre-Apellido-Clase). 3. Sobre esta columna con un simple "unique()" te daría los registros únicos, quitando las repeticiones. 4. Ahora tendrías que separar cada parte de "Mes-Dia-Año-Nombre-Apellido-Clase" por el campo "-". Un ejemplo de esta forma de separar está en el código que te pasé ayer... Saludos, Carlos Ortega www.qualityexcellence.es El 10 de marzo de 2012 18:03, Sebastian Kruk <residuo.solow@gmail.com>escribió:> Hola, tengo varios ficheros hijos. Por lo cual me interesaria en el > caso que tengan valores distintos conservarlos todos. > > El día 10 de marzo de 2012 14:48, Carlos Ortega > <cof@qualityexcellence.es> escribió: > > Hola, > > > > No entiendo muy bien la duda que planteas. > > El problema que tenías era que algunos casos de los ficheros "madre" no > > existían y los tenías que cruzar con el fichero "hijo" para conseguirlos. > > > > Ahora lo que comentas es que..¿tienes varios ficheros hijos? ¿Cada hijo > > tiene su fichero madre asociado con el que cruzar?. > > > > Vaya, el trabajo de cruzar un fichero madre con un hijo, lo puedes > convertir > > en una función para que coja los ficheros de un directorio y devuelva > como > > resultado un fichero cruzado con los casos comunes y completos. > > > > Si puedes dar más detalles del problema... > > > > > > Saludos, > > Carlos Ortega > > www.qualityexcellence.es > > > > El 10 de marzo de 2012 17:08, Sebastian Kruk <residuo.solow@gmail.com> > > escribió: > > > >> Carlos, muchas gracias. Me funcionó tu solución. > >> > >> Me faltó un detalle, yo tengo varios archivos hijos y en varios de > >> ellos tengo valores para agregar, ¿como hago? > >> > >> Saludos, > >> > >> Sebastián. > >> > >> El día 9 de marzo de 2012 20:04, Carlos Ortega > >> <cof@qualityexcellence.es> escribió: > >> > Hola Sebastian, > >> > > >> > Mira si este código resuelve el problema que planteas. > >> > Primero utilizo merge, pero para ello agrupo el campo clave (Nombre, > >> > Apellido y Clase) en un sólo string. Junto "madre" e "hijo" por este > >> > campo y > >> > luego busco los NA que tiene la parte de la "madre" para poner los del > >> > "hijo" como quieres (es el bucle). > >> > Y finalmente, deshago lo que agrupé al principio > Nombre-Apellido-Clase. > >> > > >> > Para que esto funcione, es imprescindible que el fichero "madre" lo > >> > obtengas > >> > separado por ";" o vaya, los campos que faltan que los puedas extraer > de > >> > SPSS completándolos con "NA". > >> > > >> > #################################################### > >> > > >> > Lin.mad<-"Dia;Mes;Año;Nombre;Apellido;Clase > >> > 1;;1981;Juan;Perez;A > >> > 2;2;1981;Maria;Paz;B > >> > 2;;;Pedro;García;B > >> > 3;3;1981;José;Lugano;C > >> > 1;1;1982;José;Lugano;C > >> > " > >> > > >> > mad.df <- read.table(textConnection(Lin.mad), header=T, as.is = TRUE, > >> > na.strings="NA", sep=";") > >> > > >> > > >> > Lin.hij<-"Dia Mes Año Nombre Apellido Clase > >> > 1 1 1981 Juan Perez A > >> > 3 2 1981 Maria Paz B > >> > 1 2 1982 Pedro García B > >> > 1 1 1983 José Lugano C > >> > 1 2 1984 Juan Paz B > >> > 2 2 1985 Maria García B > >> > 2 2 1984 Pedro Lugano C > >> > 2 2 1984 José Lugano A > >> > 2 2 1981 Juan Perez B > >> > 2 2 1981 Maria Paz C > >> > 2 3 1984 Pedro García A > >> > 3 3 1987 José Lugano C > >> > 3 3 1990 Juan Paz B > >> > 3 3 1993 Maria García B > >> > 3 3 1996 Pedro Lugano A > >> > 3 4 1999 José Lugano C > >> > 3 4 2002 Juan Paz C > >> > 4 4 2005 Maria García B > >> > " > >> > > >> > > >> > hij.df <- read.table(textConnection(Lin.hij), header=T, as.is > TRUE, > >> > na.strings="NA") > >> > > >> > > >> > mad.df.new<-data.frame( > >> > Dia=mad.df$Dia, > >> > Mes=mad.df$Mes, > >> > Año=mad.df$Año, > >> > > >> > NAC=paste(mad.df$Nombre,mad.df$Apellido,mad.df$Clase,sep="-") > >> > ) > >> > > >> > hij.df.new<-data.frame( > >> > Dia=hij.df$Dia, > >> > Mes=hij.df$Mes, > >> > Año=hij.df$Año, > >> > > >> > NAC=paste(hij.df$Nombre,hij.df$Apellido,hij.df$Clase,sep="-") > >> > ) > >> > > >> > > >> > com.madre<-merge(hij.df.new,mad.df.new, by.x=4, by.y=4, all.x=F, > >> > all.y=T) > >> > #com.tmp<-com.madre > >> > > >> > for(i in 1:dim(com.madre)[1]) { > >> > > >> > if(is.na(com.madre$Dia.y[i])) > >> > com.madre$Dia.y[i]<-com.madre$Dia.x[i] > >> > else com.madre$Dia.y[i]<-com.madre$Dia.y[i] > >> > > >> > if(is.na(com.madre$Mes.y[i])) > >> > com.madre$Mes.y[i]<-com.madre$Mes.x[i] > >> > else com.madre$Mes.y[i]<-com.madre$Mes.y[i] > >> > > >> > if(is.na(com.madre$Año.y[i])) > >> > com.madre$Año.y[i]<-com.madre$Año.x[i] > >> > else com.madre$Año.y[i]<-com.madre$Año.y[i] > >> > > >> > } > >> > > >> > v.tmp<-read.table(text=as.character(com.madre$NAC), sep="-") > >> > > >> > com.madre.fin<-data.frame( > >> > Dia=com.madre$Dia.y, > >> > Mes=com.madre$Mes.y, > >> > Año=com.madre$Año.y, > >> > Nombre=v.tmp$V1, > >> > Apellido=v.tmp$V2, > >> > Clase=v.tmp$V3 > >> > ) > >> > > >> > #################################################### > >> > > >> > > >> > > >> > Saludos, > >> > Carlos Ortega > >> > www.qualityexcellence.es > >> > > >> > El 9 de marzo de 2012 17:04, Sebastian Kruk <residuo.solow@gmail.com> > >> > escribió: > >> >> > >> >> Estimados usarios de R: > >> >> > >> >> Tengo una base de datos madre en formato .sav de SPSS y la quiero > >> >> modificar usando datos de otras base de datos .sav y otra en .csv a > >> >> las que llamare hijos. > >> >> > >> >> No tengo problema en convertirlas en data.frame. > >> >> > >> >> Todos los archivos tienen en común una variable que es única. > >> >> > >> >> En aquellos casos que les falta un valor a una variable en el archivo > >> >> madre lo relleno con el valor del mismo caso que lo tengo en el > >> >> archivo hijos. > >> >> > >> >> El comando merge no me permite hacer lo anterior. ¿Hay alguno más > >> >> avanzado? > >> >> > >> >> El archivo madre es mas corto que cualquiera de los archivos hijos. > >> >> > >> >> Un extracto del archivo madre: > >> >> > >> >> Dia Mes Año Nombre Apellido Clase > >> >> 1 1981 Juan Perez A > >> >> 2 2 1981 Maria Paz B > >> >> 2 Pedro García B > >> >> 3 3 1981 José Lugano C > >> >> 1 1 1982 José Lugano C > >> >> > >> >> Un extracto de un archivo hijo: > >> >> > >> >> Dia Mes Año Nombre Apellido Clase > >> >> 1 1 1981 Juan Perez A > >> >> 3 2 1981 Maria Paz B > >> >> 1 2 1982 Pedro García B > >> >> 1 1 1983 José Lugano C > >> >> 1 2 1984 Juan Paz B > >> >> 2 2 1985 Maria García B > >> >> 2 2 1984 Pedro Lugano C > >> >> 2 2 1984 José Lugano A > >> >> 2 2 1981 Juan Perez B > >> >> 2 2 1981 Maria Paz C > >> >> 2 3 1984 Pedro García A > >> >> 3 3 1987 José Lugano C > >> >> 3 3 1990 Juan Paz B > >> >> 3 3 1993 Maria García B > >> >> 3 3 1996 Pedro Lugano A > >> >> 3 4 1999 José Lugano C > >> >> 3 4 2002 Juan Paz C > >> >> 4 4 2005 Maria García B > >> >> > >> >> Las variables clave son Nombre, Apellido y Clase. > >> >> > >> >> Los casos que aparecen en en los archivos hijos distintos del madre > no > >> >> interesan. > >> >> > >> >> Si hay un NA en el archivo madre y no es NA en el archivo hijo le > >> >> pongo el valor del archivo hijo. > >> >> > >> >> Si el valor en el archivo madre no es NA pero es distinto del valor > >> >> que aparece en el archivo hijo queda el valor del archivo madre. > >> >> > >> >> Desde ya les agradezco la ayuda. > >> >> > >> >> Saludos, > >> >> > >> >> Sebastián. > >> >> > >> >> _______________________________________________ > >> >> R-help-es mailing list > >> >> R-help-es@r-project.org > >> >> https://stat.ethz.ch/mailman/listinfo/r-help-es > >> > > >> > > >> > > >> > > >> > -- > >> > Saludos, > >> > Carlos Ortega > >> > www.qualityexcellence.es > > > > > > > > > > -- > > Saludos, > > Carlos Ortega > > www.qualityexcellence.es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]