2012-06-27 6 views
3

Dans d: \ dossier, j'ai de nombreux fichiers Stata, tels que data_aa_1.dta, data_aa_2.dta, data_aa_3.dta data_bb_1.dta, data_bb_2.dta, data_bb_3.dta, data_cc_1.dta .... Je veux convertir ces fichiers et obtenir autant de trames de données que les fichiers dta dans R. Donc, je crois que je dois faire une boucle sur c ("aa", "bb", "cc") et c (1 : 3). J'ai essayé quelque chose comme le suivant:La lecture des fichiers multiples en plusieurs trames de données

library(foreign) 

for(i in c("aa","bb","cc"){ 
    for (j in 1:3){ 
     data_[i]_[j] <-read.dta("d:/folder/data_[i]_[j].dta") 
    } 
} 

Mais, cela semble faux - certainement.

Toute aide sera appréciée.

Merci!

Répondre

7

Il est sans aucun doute une plus élégante solution, mais

library(foreign) 



for(i in c("aa","bb","cc"){ 
    for (j in 1:3){ 
     obj_name <- paste('data', i, j, sep ='_') 
     file_name <- file.path('d:/folder',paste(obj_name,'dta', sep ='.')) 
     input <- read.dta(file_name) 
     assign(obj_name, value = input) 

    } 
} 

EDIT

Éviter la boucle for, et en utilisant @ suggestion de Joran de list.files

dta_files <- list.files('d:/folder', pattern = '.dta', full.names = T) 

lapply(dta_files, function(fname){ 
    input <- read.dta(fname) 
    obj_name <- tools::file_path_sans_ext(basename(fname)) 
    assign(obj_name, value input, env = .GlobalEnv)}) 
+1

Vous pouvez également pointer l'OP vers une fonction comme 'list.files'. – joran

+0

Cela fonctionne. Merci! –

7

Essayez ceci,

fl = list.files(pattern = "dta", path = "d:/folder", 
       full.names = TRUE) 
dl = lapply(fl, foreign::read.dta) 
names(dl) = tools::file_path_sans_ext(fl) 
str(dl) 
+0

Je pense que c'est le plus simple. – A5C1D2H2I1M1N2O1R2T1

Questions connexes