Stata 基于另一个变量为最后一行创建虚拟变量

Stata 基于另一个变量为最后一行创建虚拟变量,stata,Stata,我想创建一个伪变量,该变量将查看变量“count”,并从每个id的最后一行开始将行标记为1。例如,id 1的count为3,该id的最后三行将具有这样的模式:0,0,1,1,1类似地,计数为1的id 4将具有0,0,0,0,1。ID具有不同的行数。变量“wish”显示了我希望作为最终输出获得的内容 input byte id count wish str9 date 1 3 0 22sep2006 1 3 0 23sep2006 1 3 1 24sep200

我想创建一个伪变量,该变量将查看变量“count”,并从每个id的最后一行开始将行标记为1。例如,id 1的count为3,该id的最后三行将具有这样的模式:0,0,1,1,1类似地,计数为1的id 4将具有0,0,0,0,1。ID具有不同的行数。变量“wish”显示了我希望作为最终输出获得的内容

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 

实现这一点的一种方法是使用“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

实现这一点的一种方法是使用“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

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

一种方法是:

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)

我假设您已经在
id
s中对
date
变量进行了
排序。

对于以后的问题,您应该提供失败的尝试。这表明你已经完成了自己的部分,即研究你的问题

一种方法是:

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)

我假设您已经在
id
s中对
date
变量进行了
排序。

您尝试了什么?您尝试了什么?这似乎只减少了一行
排序id:gen dummy=\n>(\n-count)
。(这与@Roberto Ferrer的帖子有着相同的观点。)@Nick当然是对的。我得到了同样的答案(没有偷看山姆的答案)。啊哈!谢谢,罗伯托和尼克。我不熟悉bysort内的工作方式。你的工作现在会变得更轻松!是这里讨论基础知识的各种可能性之一。谢谢你发那篇文章,尼克。它教给我的另一个新工具是:在sum()函数中放入布尔值。聪明。这似乎通过排序id:gen dummy=\n>(\n-count)
减少到只有一行。(这与@Roberto Ferrer的帖子有着相同的观点。)@Nick当然是对的。我得到了同样的答案(没有偷看山姆的答案)。啊哈!谢谢,罗伯托和尼克。我不熟悉bysort内的工作方式。你的工作现在会变得更轻松!是这里讨论基础知识的各种可能性之一。谢谢你发那篇文章,尼克。它教给我的另一个新工具是:在sum()函数中放入布尔值。聪明。