Discussion:
[R-es] help (Crear bucle para generar un dataframe a partir de datos .mdb)
Matias Parra
2018-02-15 15:43:29 UTC
Permalink
Hola,

Tengo un conjunto de bases de datos de una encuesta industrial para
diferentes años (1995-2014). Las bases de datos están en formato .mdb. A su
vez, cada base de datos tiene 3 tablas con una variable "ID" común (la
"llave") para vincular las tablas.

Quiero realizar análisis estadísticos para analizar la evolución de ciertas
variables.

Quiero armar un dataframe que contenga todas las bases de datos (1995 a
2014) y todas las tablas (tabla 1 a tabla 3).

He podido generar un dataframe que me une las 3 tablas para un año (por ej.
2014) del siguiente modo.

library(RODBC)
setwd("C:/Users/M/Documents/R data/")
base<-odbcConnectAccess("2014")
datos1<-sqlQuery(base ,"SELECT * FROM TABLA1_2014")
datos2<-sqlQuery(base ,"SELECT * FROM TABLA2_2014")
datos3<-sqlQuery(base , "SELECT * FROM TABLA3_2014")
base1<-Reduce(function(...) merge (...,by="ID", all=T),
list(datos1,datos2,datos3))


Sin embargo, no he podido realizar un bucle para hacer este mismo proceso
para el conjunto de datos.

quiero hacer una función for para automatizar el proceso.

agradecería una ayuda al respecto.


<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Libre
de virus. www.avast.com
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

[[alternative HTML version deleted]]
Freddy Omar López Quintero
2018-02-15 16:10:39 UTC
Permalink
¡Hola!
Post by Matias Parra
library(RODBC)
setwd("C:/Users/M/Documents/R data/")
base<-odbcConnectAccess("2014")
datos1<-sqlQuery(base ,"SELECT * FROM TABLA1_2014")
datos2<-sqlQuery(base ,"SELECT * FROM TABLA2_2014")
datos3<-sqlQuery(base , "SELECT * FROM TABLA3_2014")
base1<-Reduce(function(...) merge (...,by="ID", all=T),
list(datos1,datos2,datos3))
Utilizando la función paste() y algún bucle por aquí y por allá podrías
reutilizar tu mismo código.

Por ejemplo:

sqlQuery(base, paste(paste("select * from tabla", s, sep=''), "_", año,
sep=''))
variando s de 1 a 3 y año de 1995 a 2014, haría el trabajo de
seleccionar lo que necesitas para esas tablas y períodos. Luego
restaría que la información la acumules o guardes en una lista o donde
sea más conveniente.

Ojalá sea de ayuda.

¡Salud!
--
«...homines autem hominum causa esse generatos...»

Cicero
[[alternative HTML version deleted]]
Javier Marcuzzi
2018-02-15 16:48:10 UTC
Permalink
Estimado Matías Parra

Puedes utilizar paste como opina Freddy, para ciertas cosas yo supe
realizarlo, pero R demora mucho ejecutando, lo lleva a la memoria, luego
otra vez en caso de ..., y la verdad es que se optimiza llevando los datos
a una base de datos, luego importar esta enterita a R.

Una ventaja es por ejemplo si en R encuentra cierto valor que le llama la
atención, es mucho más práctico buscarlo en la base de datos unificada,
aunque se puede realizar todo en R.

Javier Rubén Marcuzzi

El 15 de febrero de 2018, 13:10, Freddy Omar López Quintero <
Post by Freddy Omar López Quintero
¡Hola!
Post by Matias Parra
library(RODBC)
setwd("C:/Users/M/Documents/R data/")
base<-odbcConnectAccess("2014")
datos1<-sqlQuery(base ,"SELECT * FROM TABLA1_2014")
datos2<-sqlQuery(base ,"SELECT * FROM TABLA2_2014")
datos3<-sqlQuery(base , "SELECT * FROM TABLA3_2014")
base1<-Reduce(function(...) merge (...,by="ID", all=T),
list(datos1,datos2,datos3))
Utilizando la función paste() y algún bucle por aquí y por allá podrías
reutilizar tu mismo código.
sqlQuery(base, paste(paste("select * from tabla", s, sep=''), "_", año,
sep=''))
variando s de 1 a 3 y año de 1995 a 2014, haría el trabajo de
seleccionar lo que necesitas para esas tablas y períodos. Luego
restaría que la información la acumules o guardes en una lista o donde
sea más conveniente.
Ojalá sea de ayuda.
¡Salud!
--
«...homines autem hominum causa esse generatos...»
Cicero
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
https://stat.ethz.ch/mailman/listinfo/r-help-es
[[alternative HTML version deleted]]
Freddy Omar López Quintero
2018-02-15 20:05:47 UTC
Permalink
el problema que veo me aparece, es que previo al sqlQuery, debo
llamar la base de datos con odbcConnectAccess ("nombre archivo"). si
lo hago base por base me demoraría bastante.
Si RODBC no te funciona como esperas y tienes los .mdb, podrías
utilizar también la librería Hmisc, con algo como:

library(Hmisc)mdb.get(paste(año, ".mbd", sep=''), tables=paste("tabla",
s, "_", año, sep=''))
que quizá es un poco más limpio **pero** realmente no sé si vaya a
hacer el trabajo más rápido. Supongo que esto depende más de las bases
de datos de access y su tamaño que de la importación propiamente (¿?).

Ojalá sea de utilidad.

¡Salud!
--
«...homines autem hominum causa esse generatos...»

Cicero
[[alternative HTML version deleted]]
Loading...