2017-10-17 82 views
0

一般問題:我不明白如何根據其他組的條件創建值。我想這樣做:根據來自另一個組的數據有條件地標記一組中的行

gen x = cond(cond1==1 & cond2==1, value[**of some other row in a different group**], other_value) 

具體問題:給出了基於id永遠不會改變的是有一組龐大的數據集,並做了二代身份證(co_id)。每個組有多個行,在time中重複。每行有一個標誌(is_a),表示在某個時間與另一個組(即id)的關係。該關係通過更改爲co_id來表示,因此它等於另一個組。

我試圖做兩件事情:當年

  1. 的標記行(is_a == 1)發現新co_id所屬的組的id,並
  2. 對於其他羣體,旗該連接被製成

enter image description here

在上面的例子,GROU p 111在時間11上連接到組222(僅連接一次)。基於新的co_id'xzx'我想指出從那時起222的連接id。請注意,其他組可能有co_id,但正確的是co_id在數據中的最早出現(所以其中一個是222而不是777)。

對於組222,然後我標記連接的時間(time == 11)。

樣本數據:

clear 
input int id byte(is_a time) str3 co_id 
111 0 10 "abc" 
111 0 10 "abc" 
111 1 11 "xzx" 
111 1 11 "xzx" 
111 1 12 "xzx" 
111 1 12 "xzx" 
222 0 10 "xzx" 
222 0 10 "xzx" 
222 0 11 "xzx" 
222 0 11 "xzx" 
222 0 12 "xzx" 
222 0 12 "xzx" 
777 1 13 "xzx" 
end 

預先感謝您!

+1

請提供人員可以複製和粘貼的數據示例。 'ssc inst dataex'可以讓你提供一個小數據例子作爲'input'代碼。有多少人願意重新輸入他們在圖片中看到的內容?此外,術語_rows_與Stata的討論不同,正如_observations_將用於電子表格討論。 –

+0

有一個名爲'vlookup'的用戶編寫的命令,您可能會重複使用它的方法,但它不會正常工作。 –

+0

@NickCox補充說。對不起,謝謝! –

回答

0

我認爲其中一個問題是我在精神上堅持使用id作爲我的分組操作的基礎。使用co_id這裏的幫助下,與一些每個排序:

sort co_id time id 
by co_id: gen id_co = id[1] if is_a==1 

不是創建一個輔助變量,以檢查是否自去年time改變了co_id

sort id time 
by id: gen changed_co_id = cond(co_id[_n]!= co_id[_n-1], 1, 0) 
by id: replace changed_co_id = 0 if _n==1 
by id time: replace changed_co_id = 1 if changed_co_id[1]==1 

現在,我可以爲另一組創建標誌以指示何時進行連接:

#delimit ; 
sort co_id time is_a changed_co_id; 
by co_id time: gen is_conn = cond(is_a==0 & 
         changed_co_id==0 & 
         is_a[_N]==1 & 
         changed_co_id[_N]==1, 1, 0); 
#delimit cr 

因此,要創建標誌,我們需要按co_id,所以我們可以得到連接組的id s,由time得到,因此它們可以在連接時(和前進)和changed_co_id共存,所以我們可以找到確切的time其中進行連接 - 此外,這種安排確保新連接的觀察值出現在每個組的末尾。然後,我們標記啓動連接的組的觀察結果:如果它們本身沒有關聯,並且最後的觀察結果是,並且是新的。

相關問題