Как получить данные из нескольких файлов Stata?

У меня 53 стата .dta Файлы каждого из них имеют размер 150 - 200 Мб и содержат одинаковый набор переменных, но для разных лет. Бесполезно объединять или объединять их из-за их размера.

Мне нужно получить некоторые усредненные значения (проценты и т. Д.). Поэтому я хочу создать новый файл Stata New.dta и написать .do файл, который будет запускаться в этом новом файле Stata следующим образом: он должен открыть каждый из этих 53 файлов Stata, выполнить определенные вычисления и сохранить результаты в новом файле Stata,New.dta.

Я не уверен, как я могу сохранить два файла Stata открытыми одновременно, и как я могу сохранить рассчитанные значения?

Когда я открываю второй файл.dta, как я могу сделать первый файл открытым? Как я могу сохранить рассчитанные значения в глобальной переменной?

3 ответа

Решение

Что приходит на ум здесь, это использование postfile,

Вот простой пример. Сначала я настроил пример нескольких наборов данных. У вас уже есть это.

clear

forval i = 1/10 {
    set obs 100
    gen foo = `i' * runiform()
    save test`i'
    clear
}

Теперь я настроил postfile, Мне нужно настроить дескриптор, какие переменные будут использоваться, и какой файл будет использоваться. Хотя я использую числовую переменную для хранения идентификаторов файлов, возможно, будет более типично использовать строковую переменную. Кроме того, зацикливание имен файлов может быть немного сложнее, чем это. fs из SSC - удобная команда, которая помогает поместить набор имен файлов в локальный макрос; его использование здесь не показано.

postfile mypost what mean using alltest.dta

forval i = 1/10 {
    use test`i', clear
    su foo, meanonly
    post mypost (`i')  (`r(mean)')
}

Теперь сбросить результаты

postclose mypost

и посмотрим, что у нас есть.

u alltest

list 

     +-----------------+
     | what       mean |
     |-----------------|
  1. |    1   .5110765 |
  2. |    2   1.016858 |
  3. |    3   1.425967 |
  4. |    4   2.144528 |
  5. |    5   2.438035 |
     |-----------------|
  6. |    6   3.030457 |
  7. |    7   3.356905 |
  8. |    8   4.449655 |
  9. |    9   4.381101 |
 10. |   10   5.017308 |
     +-----------------+

Я не использовал глобальные макросы (не глобальные переменные) здесь; вам не нужно.

Альтернативный подход состоит в том, чтобы перебрать файлы и использовать collapse "сжать" эти файлы до соответствующих средств, а затем append эти сжатые файлы. Вот адаптация примера Ника:

// create the example datasets
clear

forval i = 1/10 {
    set obs 100
    gen foo = `i' * runiform()
    gen year = `i'
    save test`i', replace
    clear
}

// use collapse and append
// to create the dataset you want
use test1, clear
collapse (mean) year foo 
save means, replace
forvalues i = 2/10 {
    use test`i', clear
    collapse (mean) year foo 
    append using means
    save means, replace
}

// admire the result
list

Обратите внимание, что если ваши наборы данных не названы последовательно, как test1.dta, test2.dta,..., test53.dta, а скорее как results-alaska.dta, result_in_alabama.dta,..., "wyoming data.dta" (обратите внимание на пробел и, следовательно, на кавычки), вам придется организовать цикл по этим файлам несколько иначе:

local allfiles : dir . files "*.dta"
foreach f of local allfiles {
   use `"`f'"', clear
   * all other code from Maarten's or Nick's approach
}

Это более продвинутый из локальных макросов, см. Справку по расширенным функциям макросов. Также обратите внимание, что Stata создаст список, который будет выглядеть "results-alaska.dta" "result_in_alabama.dta" "wyoming data.dta" с кавычками вокруг имен файлов, поэтому, когда вы вызываете use, вам придется заключить имя файла в составные кавычки.

Другие вопросы по тегам