2012-06-27 37 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

相關問題