我的数据结构有以下目标
group; month; year; next_year
1; February; 2014; 0
1; March; 2006; 0
1; November; 2013; 1
2; January; 2014; 0
3; January; 2004; 0
我确实有group
,month
和year
,但是需要从前三个生成列next_year
:对于每个观察,我想检查一下在同一组中还有另一个观察值,其日期值落入明年的期间。如果是这样,我想将next_year
的值设置为1,否则设置为0(参见示例)。
我开始将日期转换为Stata可以解释的格式 - 使用ym(month, year)
- 这样我就可以进行比较。但是,我不确定如何迭代组内的所有观察,以确定是否是这种情况。
我知道如何在例如Java,但我不喜欢Stata。我想我不应该从循环开始,因为可能有一些已实现的命令可以解决这些问题。
答案 0 :(得分:1)
你在避免显式循环方面是正确的。使用by:
可以解决这类问题。
我修改了你的例子,在一年内对一组进行了两次观察。
clear
input group str8 month year
1 February 2014
1 March 2006
1 March 2013
1 November 2013
2 January 2014
3 January 2004
end
bysort group (year) : gen next_year = year[_n+1] == year + 1
bysort group year (next_year) : replace next_year = next_year[_N]
list, sepby(group)
+------------------------------------+
| group month year next_y~r |
|------------------------------------|
1. | 1 March 2006 0 |
2. | 1 November 2013 1 |
3. | 1 March 2013 1 |
4. | 1 February 2014 0 |
|------------------------------------|
5. | 2 January 2014 0 |
|------------------------------------|
6. | 3 January 2004 0 |
+------------------------------------+
获得明确的sort
订单至关重要。在group
内,我们展望下一个year
是否为当前year
加1,如果为真则分配1,如果为假则分配为0。对于给定group
和year
的最后一次观察,这最多也是如此。如果每组和每年有多个观察值,则必须将所有出现的1发生在所有这些观察中。
有关by:
的教程,请参阅Speaking Stata: How to move step by: step。
这里假设你的意思是在下一个日历年,而不是在接下来的12个月。大多数其他问题都需要将您的约会日期定为Stata月度日期,但这并不能使这个问题变得更容易。假设month
是字符串且year
是数字,这是在您的情况下执行此操作的一种方法:
gen mdate = monthly(month + string(year), "MY")
format mdate %tm
答案 1 :(得分:1)
如果您想在接下来的12个月内检查是否有以下观察,您可以尝试:
clear
set more off
*----- example data -----
input group str8 month year
1 March 2006
1 March 2013
1 November 2013
1 January 2013
2 January 2014
3 January 2004
end
*----- what you want -----
gen dat = monthly(month + string(year), "MY")
format dat %tm
bysort group (dat): gen next = dat[_n+1] - dat <= 12
list, sepby(group)
确保您了解Nick代码和我的代码之间的区别。他们在不同的假设下工作。您可以使用我提供的数据检查运行这两段代码的差异(最初是Nick,但删除了一个观察点以获得重点;如果您使用Nick的数据而没有修改,结果将是相同的。)