3

d:\folder に、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 などの多数の Stata ファイルがあります。これらのファイルを変換したい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")
    }
}

しかし、それは間違っているように見えます - 間違いなく。

どんな助けでも大歓迎です。

ありがとう!

4

2 に答える 2

10

これを試して、

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)
于 2012-06-27T03:28:38.890 に答える
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@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)})
于 2012-06-27T02:28:30.060 に答える