Alejandro José Estudillo Hidalgo
2014-Jul-06 15:39 UTC
[R-es] abrir varios archivos a la vez y colocarlos en un mismo data frame
Gracias por tu respuesta Jorge. El problema es que necesito que el nombre de las variables sólo aparezca en la primera fila de la matriz de datos final. Es para poder realizar análisis. Por eso en mi instrucción le pedía que leyese los nombre de las variables pero sólo para la el primer archivo. El 6 de julio de 2014, 13:39, Jorge I Velez <jorgeivanvelez@gmail.com> escribió:> Estimado Alejandro, > > Lo mejor es trabajar con listas, sea creadas antes de o despues de leer > los datos (esto ultimo automaticamente desde R). En cuanto a los nombres > de las variables, creo que ahorras tiempo y problemas si los incluyes. > > A continuacion un ejemplo (necesitas el paquete "mets"): > > # install.packages('mets') > require(mets) > > files <- list.files(path="D:/prueba") > info <- do.call(rbind, lapply(files, function(x) as.data.frame(fread(x, > header = TRUE)))) > head(info) > > Como veras, no uso read.csv(), pero el resultado es el mismo y se obtiene > en mucho menos tiempo que con cualquier version de read.*(). > > Saludos, > Jorge.- > > > > 2014-07-06 22:32 GMT+10:00 Alejandro J. Estudillo <ajestudillo@gmail.com>: > >> Buenos tardes, >> >> >> >> A ver si alguien puede ayudarme. Tengo una carpeta con 20 archivos. Cada >> uno >> de estos archivos es un data.frame con las puntuaciones de un >> participante. >> Me gustaría escribir una instrucción para que todos estos datos se agrupen >> en un solo data.frame. El caso es que para el primer de los archivos >> tendría que leer los headers, pero no para el resto (ya que los headers >> son >> los mismos para cada sujeto). He intentado correr el siguiente código >> >> >> >> files<-list.files(path="D:/prueba") >> for(i in 1:length(files)){ >> if(i==1){ >> matriz<-read.csv(files [i], header=TRUE) >> }else{ >> tmp<-read.csv(files[i],header=FALSE) >> matriz<-rbind(matriz,tmp) >> } >> } >> >> >> >> Sin embargo, obtengo el siguiente error: Error in rep(xi, length.out >> nvar) >> : attempt to replicate an object of type 'closure' >> >> >> >> Alguna idea de que puede estar fallando? >> >> >> >> Gracias!! >> >> >> >> Alex >> >> >> [[alternative HTML version deleted]] >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >-- *La civilización nos ha liberado de ciertas condiciones aversivas del ambiente, pero ciertamente no nos ha liberado del ambiente mismo.(Skinner, 1971)* [[alternative HTML version deleted]]
Jorge I Velez
2014-Jul-06 15:52 UTC
[R-es] abrir varios archivos a la vez y colocarlos en un mismo data frame
De nada, Alejandro. Con la aproximacion que te envio obtendrias el resultado que buscas puesto que do.call(rbind, ...) se encarga precisamente de ello siempre y cuando TODOS las variables tengan el mismo nombre en TODOS los archivos. Saludos, Jorge.- 2014-07-07 1:39 GMT+10:00 Alejandro José Estudillo Hidalgo < ajestudillo@gmail.com>:> Gracias por tu respuesta Jorge. El problema es que necesito que el nombre > de las variables sólo aparezca en la primera fila de la matriz de datos > final. Es para poder realizar análisis. Por eso en mi instrucción le pedía > que leyese los nombre de las variables pero sólo para la el primer archivo. > > > El 6 de julio de 2014, 13:39, Jorge I Velez <jorgeivanvelez@gmail.com> > escribió: > > Estimado Alejandro, >> >> Lo mejor es trabajar con listas, sea creadas antes de o despues de leer >> los datos (esto ultimo automaticamente desde R). En cuanto a los nombres >> de las variables, creo que ahorras tiempo y problemas si los incluyes. >> >> A continuacion un ejemplo (necesitas el paquete "mets"): >> >> # install.packages('mets') >> require(mets) >> >> files <- list.files(path="D:/prueba") >> info <- do.call(rbind, lapply(files, function(x) as.data.frame(fread(x, >> header = TRUE)))) >> head(info) >> >> Como veras, no uso read.csv(), pero el resultado es el mismo y se obtiene >> en mucho menos tiempo que con cualquier version de read.*(). >> >> Saludos, >> Jorge.- >> >> >> >> 2014-07-06 22:32 GMT+10:00 Alejandro J. Estudillo <ajestudillo@gmail.com> >> : >> >>> Buenos tardes, >>> >>> >>> >>> A ver si alguien puede ayudarme. Tengo una carpeta con 20 archivos. Cada >>> uno >>> de estos archivos es un data.frame con las puntuaciones de un >>> participante. >>> Me gustaría escribir una instrucción para que todos estos datos se >>> agrupen >>> en un solo data.frame. El caso es que para el primer de los archivos >>> tendría que leer los headers, pero no para el resto (ya que los headers >>> son >>> los mismos para cada sujeto). He intentado correr el siguiente código >>> >>> >>> >>> files<-list.files(path="D:/prueba") >>> for(i in 1:length(files)){ >>> if(i==1){ >>> matriz<-read.csv(files [i], header=TRUE) >>> }else{ >>> tmp<-read.csv(files[i],header=FALSE) >>> matriz<-rbind(matriz,tmp) >>> } >>> } >>> >>> >>> >>> Sin embargo, obtengo el siguiente error: Error in rep(xi, length.out >>> nvar) >>> : attempt to replicate an object of type 'closure' >>> >>> >>> >>> Alguna idea de que puede estar fallando? >>> >>> >>> >>> Gracias!! >>> >>> >>> >>> Alex >>> >>> >>> [[alternative HTML version deleted]] >>> >>> >>> _______________________________________________ >>> R-help-es mailing list >>> R-help-es@r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >>> >> > > > -- > > > > *La civilización nos ha liberado de ciertas condiciones aversivas del > ambiente, pero ciertamente no nos ha liberado del ambiente mismo.(Skinner, > 1971)* >[[alternative HTML version deleted]]
Oscar Perpiñan
2014-Jul-06 15:53 UTC
[R-es] abrir varios archivos a la vez y colocarlos en un mismo data frame
Hola, ¿Qué tal esta opción? Básicamente es lo que propone Jorge pero usando "read.csv" y añadiendo "scan" para leer la cabecera. files <- list.files(path="D:/prueba") tmp <- lapply(files, read.csv, header = FALSE) matriz <- do.call(rbind, tmp) header <- scan(files[1], nlines = 1, sep = ",") names(matriz) <- header Saludos. Oscar. ----------------------------------------------------------------- Oscar Perpiñán Lamigueiro Dpto. Ingeniería Eléctrica (ETSIDI-UPM) Grupo de Sistemas Fotovoltaicos (IES-UPM) URL: http://oscarperpinan.github.io Twitter: @oscarperpinan El día 6 de julio de 2014, 17:39, Alejandro José Estudillo Hidalgo <ajestudillo en gmail.com> escribió:> Gracias por tu respuesta Jorge. El problema es que necesito que el nombre > de las variables sólo aparezca en la primera fila de la matriz de datos > final. Es para poder realizar análisis. Por eso en mi instrucción le pedía > que leyese los nombre de las variables pero sólo para la el primer archivo. > > > El 6 de julio de 2014, 13:39, Jorge I Velez <jorgeivanvelez en gmail.com> > escribió: > >> Estimado Alejandro, >> >> Lo mejor es trabajar con listas, sea creadas antes de o despues de leer >> los datos (esto ultimo automaticamente desde R). En cuanto a los nombres >> de las variables, creo que ahorras tiempo y problemas si los incluyes. >> >> A continuacion un ejemplo (necesitas el paquete "mets"): >> >> # install.packages('mets') >> require(mets) >> >> files <- list.files(path="D:/prueba") >> info <- do.call(rbind, lapply(files, function(x) as.data.frame(fread(x, >> header = TRUE)))) >> head(info) >> >> Como veras, no uso read.csv(), pero el resultado es el mismo y se obtiene >> en mucho menos tiempo que con cualquier version de read.*(). >> >> Saludos, >> Jorge.- >> >> >> >> 2014-07-06 22:32 GMT+10:00 Alejandro J. Estudillo <ajestudillo en gmail.com>: >> >>> Buenos tardes, >>> >>> >>> >>> A ver si alguien puede ayudarme. Tengo una carpeta con 20 archivos. Cada >>> uno >>> de estos archivos es un data.frame con las puntuaciones de un >>> participante. >>> Me gustaría escribir una instrucción para que todos estos datos se agrupen >>> en un solo data.frame. El caso es que para el primer de los archivos >>> tendría que leer los headers, pero no para el resto (ya que los headers >>> son >>> los mismos para cada sujeto). He intentado correr el siguiente código >>> >>> >>> >>> files<-list.files(path="D:/prueba") >>> for(i in 1:length(files)){ >>> if(i==1){ >>> matriz<-read.csv(files [i], header=TRUE) >>> }else{ >>> tmp<-read.csv(files[i],header=FALSE) >>> matriz<-rbind(matriz,tmp) >>> } >>> } >>> >>> >>> >>> Sin embargo, obtengo el siguiente error: Error in rep(xi, length.out >>> nvar) >>> : attempt to replicate an object of type 'closure' >>> >>> >>> >>> Alguna idea de que puede estar fallando? >>> >>> >>> >>> Gracias!! >>> >>> >>> >>> Alex >>> >>> >>> [[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 >>> >>> >> > > > -- > > > > *La civilización nos ha liberado de ciertas condiciones aversivas del > ambiente, pero ciertamente no nos ha liberado del ambiente mismo.(Skinner, > 1971)* > > [[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 >
Oscar Perpiñan
2014-Jul-06 15:58 UTC
[R-es] abrir varios archivos a la vez y colocarlos en un mismo data frame
> Con la aproximacion que te envio obtendrias el resultado que buscas puesto > que do.call(rbind, ...) se encarga precisamente de ello siempre y cuando > TODOS las variables tengan el mismo nombre en TODOS los archivos.Efectivamente, tienes toda la razón. Sobran las dos últimas líneas de lo que acabo de enviar. Oscar.