[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 17:08:11 CET 2012


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



Más información sobre la lista de distribución R-help-es