2016-02-27 90 views
0

我有數據集是這樣的:添加在的foreach命令第二個變量 - 塔塔

C:\temp\SalesFigures FY13.dta 
C:\temp\SalesFigures FY14.dta 
C:\temp\SalesFigures FY15.dta 
etc. 

每個文件都包含來自50個州的銷售數據。我經常需要爲這些文件中的一些狀態運行一段代碼。我在一個名爲StatesToRun.dta(例如AK,CA,WA)的文件中指定這些狀態,並使用foreach命令循環每個狀態。我也使用宏來指定我想使用的風雲.dta文件。

例如:

* Specify file to run. 
local FY "FY14" 

* Run code only for the states I list in StatesToRun.dta. 
use "C:/temp/StatesToRun.dta", clear 
levelsof state, local(statelist) 

foreach MyState of local statelist 

{ 

use "C:/temp/SalesFigures 'FY'.dta", clear 
keep if state == `"`MyState'"' 
* etc. ... 

} 

的必要性

我有時需要我的代碼運行數的FY文件的C:\temp。所以我想爲此創建一個循環。例如,如果我想爲2014財年和2015財年的.dta文件運行AK,CA和WA的代碼,則在StatesToRun.dta中爲狀態輸入「AK」,「CA」和「WA」,並輸入「 FY14「和」FY15「的變量可以在StatesToRun.dta中稱爲」FY「。我只是不確定如何將第二個變量合併到循環中。我讀過你可以嵌套foreach陳述,但我不確定這是否是最好的方法。

作爲相當新的塔塔,這是我最好的猜測:

* Run code only for the states and FYs I list in StatesToRun.dta. 
use "C:/temp/StatesToRun.dta", clear 
levelsof state, local(statelist) 
levelsof FY, local(FYlist) 

foreach MyState of local statelist { 
foreach MyFY of local FYlist { 

use "C:/temp/SalesFigures 'MyFY'.dta", clear 
keep if state == `"`MyState'"' 
* etc. ... 

} 
} 

我在正確的道路上?

+0

第一個示例不會運行;開放式大括號必須與「foreach」位於同一行。 –

+0

看起來是不必要的間接放置例如數據集中的「AK CA WA」只是將它們再次取出。爲什麼不直接輸入它們? –

+0

羅伯託 - 正確。這是一個錯字。 Nick - 要運行的狀態列表用於其他約8個例程和單獨的語法,因此很容易將它們全部存儲在一個位置(外部文件),因此每個例程都可以引用該單個文件。 – Larry

回答

1

您不需要一個循環(也不需要一個)來保留觀察值,如另一個數據集中的某個「列表」所指示的。您可以使用merge

clear 
set more off 

*----- example file with list of interest ---- 

sysuse auto 
keep make 
drop in 6/69 

list 

tempfile MakesToRun 
save "`MakesToRun'" 

*---- work with selected observations ---- 

clear 
set more off 

sysuse auto 
keep make price mpg rep78 

list 

// keep observations that only appear in list of interest 
merge 1:1 make using "`MakesToRun'", keep(matched) 

list 

檢查help merge和相應的人工輸入來獲得其工作認真抓好。

您可以使用循環對多個文件執行此操作。

也許有更好的方法來設置整個事情,但我們沒有足夠的信息。

+0

循環內的完整代碼長達幾百行。 'keep if'命令只是使用'MyState'值的許多不同命令中的第一個(如tempfile持有,保存'持有',打開另一個文件,刪除MyState,追加,替換等。 MyState'稍後也用於保存具有狀態名稱的文件(例如'save「...」MyState'.dta。「的結果)等等。 – Larry