Как получить данные из нескольких файлов 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
, вам придется заключить имя файла в составные кавычки.