2017-08-07 73 views
0
ID A1 A2 A3 
1001 ABD AAA ABC 
1002 ABE BBB CCC 
1003 ABC CCC DDD 

我有一個循環,如下所示:顯示或打印用於調試循環變量

generate trackr = 0 
display "generated trackr" 
foreach var of varlist a1 a2 a3{ 
    display "`var'" id[_n] 
    replace trackr = 1 if (`var'=="ABC") 
} 

在Stata,我想找出和打印時的變化已經到trackr製造。 (我想找出其中的行/列「ABC」被發現。)

我試過上述id[_n]和它的作品只是部分。

我想顯示id[_n]只有if var=="ABC"trackr更改爲1(從0開始)。我嘗試將所有內容都放入if區塊,但我認爲Stata中的if的工作方式不同?

+0

措辭'「獎金」是好老師挑戰的學生,而不是學生問老師! –

回答

0

你不需要爲你看起來是想要一個循環。查看來自SSC的dataex,可以更好地提供Stata問題中的示例數據。

clear 
input ID str3 (A1 A2 A3) 
1001 ABD AAA ABC 
1002 ABE BBB CCC 
1003 ABC CCC DDD 
end 

gen trackr = inlist("ABC", A1, A2, A3) 
list if inlist("ABC", A1, A2, A3) 

    +---------------------------------+ 
    | ID A1 A2 A3 trackr | 
    |---------------------------------| 
    1. | 1001 ABD AAA ABC  1 | 
    3. | 1003 ABC CCC DDD  1 | 
    +---------------------------------+ 

這裏inlist()產量1,如果任何的第二和隨後的參數等於所述第一個參數,否則爲0。

在你的循環像display A1[_n]只會在第一次觀測值顯示,如您遍歷變量,而不是觀察。但是不需要循環。

如果你想看到的只是滿足您的條件先觀察,一個辦法做到這一點是

. list if trackr & sum(trackr) == 1 

    +---------------------------------+ 
    | ID A1 A2 A3 trackr | 
    |---------------------------------| 
    1. | 1001 ABD AAA ABC  1 | 
    +---------------------------------+ 

,接下去就是list if sum(inlist("ABC", A1, A2, A3)) == 1也將努力找到第一個這樣的觀察。

+0

感謝Cox教授,這將完美實現!將來會研究dataex以便發佈示例。 –

+0

我想,當我通過Stata的文檔,我有時甚至不知道什麼功能(S),以尋找可能正是我需要的。在這種情況下,它是inlist()。你最後一次指示我bysort(它映射到groupby)。如果我想執行更多類似數據庫的操作,以交點(2個向量)開始,到更復雜的內部和外部連接,我會從哪裏開始調查這些操作?換句話說,是否有一個詞彙表將Stata函數映射爲來自其他語言的常用/已知範例(反之亦然)? –

+0

相反,我不知道'在某些語言你不狀態groupby'是大致相同'bysort'在Stata除非你告訴我,這是。但是,你想要的是Stata對你熟悉的術語的翻譯,雖然我同情我不知道任何這樣的詞彙表存在。對於Stata用戶來說,有一本關於R的書,但這兩位作者都沒有或者對Stata非常權威,而且我從來沒有讀過它,我也不知道它對逆向工程有多大用處。積極的建議是跳過可能相關的手動部分,如數據管理或功能。 –