Stata 基于另一个变量为最后一行创建虚拟变量
我想创建一个伪变量,该变量将查看变量“count”,并从每个id的最后一行开始将行标记为1。例如,id 1的count为3,该id的最后三行将具有这样的模式:0,0,1,1,1类似地,计数为1的id 4将具有0,0,0,0,1。ID具有不同的行数。变量“wish”显示了我希望作为最终输出获得的内容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
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()函数中放入布尔值。聪明。