根据来自另一个组的数据有条件地标记一组中的行
问题描述:
一般问题:我不明白如何根据其他组的条件创建值。我想这样做:根据来自另一个组的数据有条件地标记一组中的行
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
来表示,因此它等于另一个组。
我试图做两件事情:当年
- 的标记行(
is_a == 1
)发现新co_id
所属的组的id
,并 - 对于其他群体,旗该连接被制成
在上面的例子,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
预先感谢您!
答
我认为其中一个问题是我在精神上坚持使用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
其中进行连接 - 此外,这种安排确保新连接的观察值出现在每个组的末尾。然后,我们标记启动连接的组的观察结果:如果它们本身没有关联,并且最后的观察结果是,并且是新的。
请提供人员可以复制和粘贴的数据示例。 'ssc inst dataex'可以让你提供一个小数据例子作为'input'代码。有多少人愿意重新输入他们在图片中看到的内容?此外,术语_rows_与Stata的讨论不同,正如_observations_将用于电子表格讨论。 –
有一个名为'vlookup'的用户编写的命令,您可能会重复使用它的方法,但它不会正常工作。 –
@NickCox补充说。对不起,谢谢! –