2014-12-06 148 views
0

我剛剛開始學習Stata,並且我很難。 我的問題是這樣的:我有兩個不同的變量,ATCA,其中A可能是ATC的子字符串。 現在我想標記AATC的子字符串與OK = 1的所有觀察。Stata嵌套foreach循環子串比較

我想這用一個簡單的嵌套循環:

foreach x in ATC { 
foreach j in A { 
     replace OK = 1 if strpos(`x',`j')!=0 
    } 
} 

但是,每當我跑這個循環沒有變化正在作出即使應該有很多。 我覺得我應該給一個索引指定哪個OK正在改變(屬於ATC/x的那個),但我不知道該怎麼做。這可能很簡單,但我一直在努力一段時間。


我應該澄清:我A名單是從主列表(簡單地附加到)分離,只包含我用它來識別ATC S的我想唯一的密鑰。所以我有〜120 A-鍵和幾百萬個鍵ATC。我想要做的是迭代每密鑰爲每個A鍵,並標記ATCA合格。

這意味着我沒有完整的元組(ATC,A,OK),而是分開不同大小的列表。 例如:我有

ATC OK A 
ABCD 0 . 
EFGH 0 . 
... ... ... 
.  . AB 
.  . ET 

,並希望結果是"ABCD"OK被標記爲1"EFGH"保持在0

回答

5

我們可以將您的問題分爲兩部分。你的標題意味着循環的問題,但你的循環只是相當於

replace OK = 1 if strpos(ATC, A)!=0 

所以使用循環顯得無關緊要。這留下了子串比較。

讓我們提供一個例子:

. set obs 3 
obs was 0, now 3 

. gen OK = 0 

. gen A = cond(_n == 1, "42", "something else") 

. gen ATC = "answer is 42" 

. replace OK = 1 if strpos(ATC, A) != 0 
(1 real change made) 

. list 

    +------------------------------------+ 
    | OK    A   ATC | 
    |------------------------------------| 
1. | 1    42 answer is 42 | 
2. | 0 something else answer is 42 | 
3. | 0 something else answer is 42 | 
    +------------------------------------+ 

所以它工作正常;如果你認爲你有不同的東西,你真的需要給出一個可重複的例子。

至於說明變量應該改變的地方:你的代碼就是這樣做的,正如上面的例子所示。


該更新使問題清楚。當你指定你給出的語法時,Stata只會在相同的觀察中查找匹配的子字符串。 Stata中的變量是數據集中的字段。要在週期的一組值,這樣的事情應該足夠

gen byte OK = 0 
levelsof A, local(Avals) 

quietly foreach A of local Avals { 
    replace OK = 1 if strpos(ATC, `"`A'"') > 0 
} 

注:

  1. 指定byte精簡存儲。

  2. 您可能需要ifin限制levelsof

  3. quietly刪除有關更改值的消息。在調試時,通常最好不要這樣做。

  4. > 0可能會被省略,因爲strpos()在邏輯比較中被自動視爲true。見this FAQ

+0

我編輯了我原來的帖子。我應該從一開始就給出一個例子,謝謝你的幫助。我爲我差的格式化等道歉,因爲我不使用這個網站非常。 – user2299050 2014-12-07 00:47:28

+0

刪除「可能」。問題現在很清楚。 – 2014-12-07 01:04:46

+0

感謝您的關閉! – 2014-12-07 01:47:02