根据另一个组

时间:2017-10-17 11:35:52

标签: conditional-statements stata

一般问题:我不了解如何根据其他群组的条件创建值。我想做点什么:

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

具体问题:鉴于大量数据集包含基于id的组永不更改,以及辅助ID(co_id)。每个组都有多行,在time中重复。每行都有一个标志(is_a),表示在某个时间与另一个组(即id)的关系。该关系由co_id的更改表示,因此它等于另一组。

我正在尝试做两件事:

  1. 对于已标记的行(is_a == 1),找到新id所属的组的co_id,并
  2. 对于其他组,标记建立连接的年份
  3. enter image description here

    在上面的示例中,群组111已及时222连接到群组11(连接只进行一次)。根据新的co_id 'xzx',我希望从那时开始指出id的{​​{1}}。请注意,其他群组可以包含222,但正确的群组可能是数据中co_id的最早出现(因此,co_id而不是222)。

    对于组222,然后我标记连接的时间(777)。

    示例数据:

    time == 11

    提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为其中一个问题是我在精神上坚持使用id作为我的分组操作的基础。在这里使用co_id帮助了一些按排序:

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

创建一个辅助变量来检查co_id以来time是否发生了变化:

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得到所连接组的timechanged_co_id,这样它们就可以共存了连接(以及之后)和time因此我们可以找到连接所在的确切php artisan make:request myQuantityBoxRequest - 此外,这种安排可确保新连接的观察结果出现在每个组的末尾。然后我们标记发起连接的组的观察结果:如果它们没有自己连接并且最后一个观察结果是,那么就是新的。