在d:\ folder中,我有很多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")
    }
}


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

任何帮助将不胜感激。

谢谢!

最佳答案

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

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循环,并使用@joran的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)})

10-01 23:08