2016-11-11 42 views
0

假設我有變量具有下列名稱的數據集(注意xhm存根):循環執行變量與當地的宏通配符

x9, xdog, x_99, hma8j, hm40, hm0 

我想開發一個編程的方式來提供列表變量名稱(可能包含通配符),然後遍歷每個變量名稱以重新編碼小於0的所有值(.)。在實踐中,我有很多列,只想重新編碼一些列。我不想使用列索引或範圍,因爲我不知道它們,因爲我的數據很大。我的方法:

創建一個包含通配符

local myvars x* hm* 

變量名稱展開變量列表中的字符串包含完整的變量名字符串名爲myvars本地宏(應出示原件變量名)

syntax 'myvars' 

遍歷變量名,失蹤的一組值列表..

foreach x of local 'myvars' { 
    replace 'x' = . if 'x' < 0 
} 

上述代碼無效併產生「無效語法」警告。誰能幫我?我無法弄清楚如何在循環中包含通配符。

當我發現下面是有用的,他們不提供解決方案和使用存根似乎並不高效:

http://www.stata.com/statalist/archive/2008-06/msg01060.html http://www.stata.com/statalist/archive/2006-08/msg00616.html

回答

1

@ timat的答案給出了一個很好的基本解決方案,但沒有解釋什麼你做錯了。

看來,你正在在幾個層次上困惑:

如何引用本地宏

使用左,右單引號,不重複(右)單引號:

. local foo = 42 

. di `foo' 
42 

如何最好地解開通配符變量列表

syntax會這樣做,但由於foreach會直接做到,syntax對於您的問題是多餘的。但即使如此,您的示例在幾個方面也是十分錯誤的。由於它的使用是不必要的,我不會在這方面擴大。

宏名稱及其內容

foreach x of local `myvars' { 

(注意糾正標點)之間的區別是幾乎從來沒有你所需要的。它通常是

foreach x of local myvars { 

柱思

塔塔不是一個電子表格程序。列可以是你的私人詞,並且沒有損害,但列索引不直接支持。

如何找到答案

你是(我猜的)谷歌搜索答案,不嘗試讀取Stata的文檔。後者有很多,初學者很難知道去哪裏看,但foreach的基本幫助和相關解釋比您引用的帖子更有效。他們都很好(原來我寫的都是......),但離你的問題有一段距離,你也沒有在你的問題中找到答案也就不足爲奇了。如果你想掌握基本的Stata,至少閱讀「用戶指南」的前半部分是不可替代的。

+0

對本地宏問題的引用實際上是在我的代碼中解決的,但我不確定如何在SO中使用正確的引號,因爲使用''聲明瞭內聯代碼。 我想了解如何做到這一點與可讀性的語法。我寧願使用本地宏將變量移到自己的行中,而不是循環代碼。在循環的左括號之前簡單地聲明通配符使其難以閱讀。我知道Stata中的變量序列稱爲範圍,但也可以指變量的值。 – QuestionAnswer

+0

我(我們)只能繼續我(我們)在這裏閱讀的內容,並且不知道計算機上的內容有何不同和正確。同意:這裏的標記意味着你需要轉義文字反引號,或者如我的回答,只是給代碼縮進。我不認爲你完全理解宏,因爲你的'foreach ... local \'myvars''中的引號對於你想要的是非常錯誤的。否則,這個評論就是口味的宣言,我懷疑任何有經驗的Stata程序員都會分享你的品味。除了給你一個非常間接的解決方案外,沒有什麼意義可以用'syntax'來做任何事情。 –