假設我有變量具有下列名稱的數據集(注意x
和hm
存根):循環執行變量與當地的宏通配符
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
對本地宏問題的引用實際上是在我的代碼中解決的,但我不確定如何在SO中使用正確的引號,因爲使用''聲明瞭內聯代碼。 我想了解如何做到這一點與可讀性的語法。我寧願使用本地宏將變量移到自己的行中,而不是循環代碼。在循環的左括號之前簡單地聲明通配符使其難以閱讀。我知道Stata中的變量序列稱爲範圍,但也可以指變量的值。 – QuestionAnswer
我(我們)只能繼續我(我們)在這裏閱讀的內容,並且不知道計算機上的內容有何不同和正確。同意:這裏的標記意味着你需要轉義文字反引號,或者如我的回答,只是給代碼縮進。我不認爲你完全理解宏,因爲你的'foreach ... local \'myvars''中的引號對於你想要的是非常錯誤的。否則,這個評論就是口味的宣言,我懷疑任何有經驗的Stata程序員都會分享你的品味。除了給你一個非常間接的解決方案外,沒有什麼意義可以用'syntax'來做任何事情。 –