2015-07-02 60 views
2

我有許多字符串變量v1 v2 ... v10,每個字母變量都包含一個字母。我想要做的是加入v1v2,v3v4等等直到v9v10。對於單個案例,代碼很簡單v12 = v1 + v2。問題是當我想爲我的數據集中的所有對執行此操作時。我嘗試下面的代碼,但我得到錯誤的結果。在Stata中使用循環成對加入字符串變量

forval i=1(2)9 { 
    gen var`i' = v`i' + v`i+1' 
} 

這裏是我想要的一個例子:

v1 v2 v12 
G G GG 
A G AG 
G G GG 
A A AG 

和我所得到的:

v1 v2 v12 
    G G GG 
    A G AA 
    G G GG 
    A A AA 

對其使用相同的變量(v1)兩次某些原因。

回答

4

你不能用本地宏,甚至那些包含數字的算法來進行算術運算。這是塔塔只是忽略了宏引用中額外+1一個怪胎,如在這個例子中:

. local i = 1 

. di "`i+1'" 
1 

嚴格,i+1是不是一個合法的宏名,給予+字符。無論如何,無視Stata所做的額外文本。

有多種方式可以得到你想要的東西。這裏有一個:

forval i = 1(2)9 { 
    local j = `i' + 1 
    gen var`i' = v`i' + v`j' 
} 

和這裏的另一個:

forval i = 1(2)9 { 
    gen var`i' = v`i' + v`=`i'+1' 
} 

額外的符號

`= ' 

方式計算表達式給出,然後插入結果。它與你所嘗試的精神緊密相關。

1

試試這個。

clear 
input str1 (v1 v2 v3) 
G G Q 
A G R 
G G S 
A A T 
end 
forval i=1/2{ 
    gen var`i'=v`i'+v`=`i'+1' 
    } 
list, clean 

這裏的輸出。

 v1 v2 v3 var1 var2 
    1. G G Q  GG  GQ 
    2. A G R  AG  GR 
    3. G G S  GG  GS 
    4. A A T  AA  AT 

你會想forval i=1/9在你的情況。用於將內聯值1加1的語法`=`i'+ 1'稱爲help macro中的擴展運算符。

1

這是一種奇怪的是,你得到

. local i 4 

. dis "`i+1'" 
4 

而這可能由宏擴展不會拋出一個錯誤的事實解釋。

無論如何,有宏擴展運算符可用於增加或減少宏(請參閱help macro)。

clear 
input str1 (v1 v2 v3) 
G G Q 
A G R 
G G S 
A A T 
end 

local i = 1 
while `i' < 3 { 
gen var`i' = v`i' + v`++i' 
} 
list, clean 

你甚至可以用循環計數器玩:

clear 
input str1 (v1 v2 v3) 
G G Q 
A G R 
G G S 
A A T 
end 

forval i=1/2{ 
    gen var`i' = v`i++' + v`i--' 
} 
list, clean 
相關問題