根据来自另一个组的数据有条件地标记一组中的行

根据来自另一个组的数据有条件地标记一组中的行

问题描述:

一般问题:我不明白如何根据其他组的条件创建值。我想这样做:根据来自另一个组的数据有条件地标记一组中的行

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补充说。对不起,谢谢! –

我认为其中一个问题是我在精神上坚持使用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其中进行连接 - 此外,这种安排确保新连接的观察值出现在每个组的末尾。然后,我们标记启动连接的组的观察结果:如果它们本身没有关联,并且最后的观察结果是,并且是新的。