2016-05-30 50 views
0

我有一個C到BQ(1950年至2016年)列C年的Excel文件。我通過import excel讀取它,並且有一個數據集ABQ,CBQ是年。forval和varlist循環錯誤

我倒是想通過下面的循環重命名CBQ_1950_2016但似乎有錯。

forval i=1950/2016 { 
    foreach x of varlist C-BQ { 
     rename `x' _`i+1' 
    } 
} 

C被重命名爲_1950但塔塔拋出:

變量_1950已經定義

回答

2

你不需要循環:看到help rename group的技術。在你的情況下,這是一個簡單的例子。

. ds 
A B C D E 

. 
. rename (C-E) _#, addnumber(1950) 

. 
. ds 
A  B  _1950 _1951 _1952 

. 

你出錯的地方在於你的雙循環例子是最內層循環和最外層循環不會一前一後增加。

. forval i=1950/1952 { 
    2. foreach x of varlist C-E { 
    3. 
. display `" rename `x' _`i+1' "' 
    4. 
.  } 
    5. } 
rename C _1950 
rename D _1950 
rename E _1950 
rename C _1951 
rename D _1951 
rename E _1951 
rename C _1952 
rename D _1952 
rename E _1952 

+0

thx很多(對你的機器人!) –

+0

有關爲什麼OP的增量嘗試不起作用的評論,請參閱我的答案。 –

1

這裏有兩個問題。你需要一個循環,增加本地宏的語法是錯誤的。

語法

`i+1' 

不等同於當地的宏i加1

的價值試試:

. local i = 42 

. di "`i+1'" 
42 

發生了什麼事是,塔塔忽略+1內作爲尾隨垃圾的宏引用,但它確實顯示了宏i中的內容:它可以理解該引用即這裏適用的規則是+不能是合法宏名稱的一部分。

你能做到這一點採取局部宏,加1,並顯示結果:

. di "`=`i'+1'" 
43 

查看幫助macro

正如William Lisowski指出的那樣,rename將以任何方式爲您進行重命名,而無需顯式循環。

但是,如果您不知道,或者如果您使用的是支持循環但不支持Stata 12中引入的額外rename工具的Stata版本,您將如何循環?這裏有一種方法:

local i = 1950 
foreach x of varlist C-BQ { 
    rename `x' _`i' 
    local ++i 
} 

另一種方式來做到這一點的Stata 12之前是使用renvars塔塔雜誌

renvars C-BQ \ _1950-_2016 

renvars需要的Stata 8了。當然,在表面之下,它正在對舊變量和新變量名執行循環。