2012-06-27 36 views
3

在d:\文件夹中,我有许多Stata文件,例如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 ....我想转换这些文件并获得与R中的dta文件一样多的数据帧。因此,我相信我必须循环c(“aa”,“bb”,“cc”)和c(1 :3)。我尝试了以下内容:将多个文件读入多个数据帧

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") 
    } 
} 

但是,这看起来是错误的 - 绝对是。

任何帮助将不胜感激。

谢谢!

回答

7

有无疑是一个更优雅的解决方案,但是

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) 

    } 
} 

编辑

避免了for回路,并使用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

你也可以将OP指向一个像'list.files'这样的函数。 – joran

+0

这工作。谢谢! –

7

@ joran的建议试试这个,

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

我会认为这是最直接的。 – A5C1D2H2I1M1N2O1R2T1

相关问题