Чтение нескольких файлов в несколько фреймов данных

В папке 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 .... Я хочу преобразовать эти файлы и получить столько кадров данных, сколько файлов dta в R. Итак, я считаю, что мне нужно перебрать 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")
    }
}

Но это выглядит неправильно - определенно.

Любая помощь будет оценена по достоинству.

Спасибо!


person Bill TP    schedule 27.06.2012    source источник


Ответы (2)


Несомненно, есть более элегантное решение, однако

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)})
person mnel    schedule 27.06.2012
comment
Вы также можете указать OP на такую ​​функцию, как list.files. - person joran; 27.06.2012

Попробуй это,

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)
person baptiste    schedule 27.06.2012
comment
Я думаю, это самый простой вариант. - person A5C1D2H2I1M1N2O1R2T1; 27.06.2012