我有一个包含31个文件的目录,我必须在其中创建一些变量,然后加入它们。我正在尝试循环,但我不能。有人能帮助我吗?
cd "my dir"
local allfiles: dir "my dir" files "*.dta"
clear
foreach f in `allfiles' {
use `f'
egen string_id = concat(ido idd)
sort string_id
by string_id: gen first = _n==1
gen id = sum(first)
drop first
sort year id
by year id: egen Value=sum(value)
by year id: egen Quantity=sum(quantity)
save `mydata', replace
append using `mydata'
}
答案 0 :(得分:1)
您的报告
我正在尝试循环,但我不能
不是很有用。
请记住指出您面临的确切问题,即您获得的内容,您的期望,以及不明显的原因,以及它们为何不同。
下面是工作代码,假设您在示例目录中有两个内置自动数据集(使用sysuse auto
加载它)的副本。
clear
set more off
// example directory with auto1.dta and auto2.dta
cd "/home/roberto/Desktop/stata_tests/"
local allfiles: dir "`c(pwd)'" files "*.dta"
// create empty dataset to initiate appending
tempfile mydata
save "`mydata'", emptyok
foreach f in `allfiles' {
// load data and do whatever
use "`f'", clear
gen source = "`f'"
// append first, then save
append using "`mydata'"
save "`mydata'", replace
}
// check
keep make source
sort make source
list in 1/16, sepby(make)
输出:
. list in 1/16, sepby(make)
+---------------------------+
| make source |
|---------------------------|
1. | AMC Concord auto1.dta |
2. | AMC Concord auto2.dta |
|---------------------------|
3. | AMC Pacer auto1.dta |
4. | AMC Pacer auto2.dta |
|---------------------------|
5. | AMC Spirit auto1.dta |
6. | AMC Spirit auto2.dta |
|---------------------------|
7. | Audi 5000 auto1.dta |
8. | Audi 5000 auto2.dta |
|---------------------------|
9. | Audi Fox auto1.dta |
10. | Audi Fox auto2.dta |
|---------------------------|
11. | BMW 320i auto1.dta |
12. | BMW 320i auto2.dta |
|---------------------------|
13. | Buick Century auto1.dta |
14. | Buick Century auto2.dta |
|---------------------------|
15. | Buick Electra auto1.dta |
16. | Buick Electra auto2.dta |
+---------------------------+
另请参阅ssc describe fs
和ssc describe filelist
。