根据另一个变量为最后一行创建一个虚拟变量

时间:2014-12-12 16:03:20

标签: stata

我想创建一个虚拟变量来查看变量" count"并从每个id的最后一行开始将行标记为1。例如,ID 1的计数为3,此id的最后三行将具有这样的模式:0,0,1,1,1类似地,ID为1的ID 4将具有0,0,0,1 。 ID具有不同的行数。变量"愿望"显示我想要获得的最终输出。

input  byte id count wish str9 date
1   3   0   22sep2006
1   3   0   23sep2006
1   3   1   24sep2006
1   3   1   25sep2006
1   3   1   26sep2006
2   4   1   22mar2004
2   4   1   23mar2004
2   4   1   24mar2004
2   4   1   25mar2004
3   2   0   28jan2003
3   2   0   29jan2003
3   2   1   30jan2003
3   2   1   31jan2003
4   1   0   02dec1993
4   1   0   03dec1993
4   1   0   04dec1993
4   1   1   05dec1993
5   1   0   08feb2005
5   1   0   09feb2005
5   1   0   10feb2005
5   1   1   11feb2005
6   3   0   15jan1999
6   3   0   16jan1999
6   3   1   17jan1999
6   3   1   18jan1999
6   3   1   19jan1999
end 

2 个答案:

答案 0 :(得分:3)

对于将来的问题,您应该提供失败的尝试。这表明你已经完成了自己的工作,即研究你的问题。

一种方法是:

clear
set more off

*----- example data -----

input ///
byte id count wish str9 date
1   3   0   22sep2006
1   3   0   23sep2006
1   3   1   24sep2006
1   3   1   25sep2006
1   3   1   26sep2006
2   4   1   22mar2004
2   4   1   23mar2004
2   4   1   24mar2004
2   4   1   25mar2004
3   2   0   28jan2003
3   2   0   29jan2003
3   2   1   30jan2003
3   2   1   31jan2003
4   1   0   02dec1993
4   1   0   03dec1993
4   1   0   04dec1993
4   1   1   05dec1993
5   1   0   08feb2005
5   1   0   09feb2005
5   1   0   10feb2005
5   1   1   11feb2005
6   3   0   15jan1999
6   3   0   16jan1999
6   3   1   17jan1999
6   3   1   18jan1999
6   3   1   19jan1999
end 

list, sepby(id)

*----- what you want -----

bysort id: gen wish2 = _n > (_N - count)

list, sepby(id)

我假设您已在sortdate编辑了id变量。

答案 1 :(得分:2)

实现此目的的一种方法是使用'bysort'类型逻辑来使用组内行号:

***Create variable of within-group row numbers.

bysort id: gen obsnum = _n

***Calculate total number of rows within each group.

by id: egen max_obsnum = max(obsnum)

***Subtract the count variable from the group row count.
***This is the number of rows where we want the dummy to equal zero.

gen max_obsnum_less_count = max_obsnum - count

***Create the dummy to equal one when the row number is
***greater than this last variable.

gen dummy = (obsnum > max_obsnum_less_count)

***Clean up.

drop obsnum max_obsnum max_obsnum_less_count