[R-es] unir 2 dataframe con con igual caso pero distinto valor en igual variable
Sebastian Kruk
residuo.solow en gmail.com
Sab Mar 10 18:03:57 CET 2012
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
Más información sobre la lista de distribución R-help-es