我有一个天数列表(编号为195-720),每天都有多个观察结果。我最终想确定哪些日子是工作日,哪些是周末日。如果我可以在每个日期分配数字1-7,我就能做到这一点。目前,数据如下所示:
Day Household ID Hour of Day
195 1 1
195 1 2
195 1 3
195 1 4
196 1 1
196 1 2
196 1 3
197 1 1
197 1 2
可能需要注意的是,每天的观察数量不一致(例如,第195天观察4次,第196天观察3次,第197天观察2次)。
我知道第195天是星期二,为了简单起见,我想编码等于“2”(星期三= 3,星期四= 4等)。
因此,我想得到以下输出:
Day Household ID Hour of Day DAY OF WEEK
195 1 1 2
195 1 2 2
195 1 3 2
195 1 4 2
196 1 1 3
196 1 2 3
196 1 3 3
197 1 1 4
197 1 2 4
在查看Stata文档后,我考虑使用DYM / DMY。但是,这不起作用,因为我没有原始的“日期”变量可供使用。相反,我只有一个数字“195”,对应于7月12日星期二。
我想使用类似的东西:
bysort day: egen Hour_of_Day = seq(2, 3, 4, 5, 6, 7, 1)
然而,Stata告诉我这有语法错误。注意:我以“2”开头,因为我的第一天(195)是星期二。我还考虑了carryforward
或mod(x,y)
或fill
等命令。
有谁知道如何设置序列以填充每天的相同内容?如何修复此代码以实现所需的输出?
答案 0 :(得分:0)
如果你知道195是星期二,那么逆向工程很简单。 193必须是周日和周六199。
让我们看看那个星期的沙箱,193到199.我们对我们自己的星期几功能的第一次猜测将使用mod()
函数(不一个命令)。 This paper对Stata中的应用程序进行了简短的试验。
. clear
. set obs 7
number of observations (_N) was 0, now 7
. gen day = 192 + _n
. gen dow = mod(day, 7)
. list, sep(0)
+-----------+
| day dow |
|-----------|
1. | 193 4 |
2. | 194 5 |
3. | 195 6 |
4. | 196 0 |
5. | 197 1 |
6. | 198 2 |
7. | 199 3 |
+-----------+
Stata的星期几会议是0表示星期日,6表示星期六。那只是一个轮换。
. gen DOW = mod(day + 3, 7)
. list, sep(0)
+-----------------+
| day dow DOW |
|-----------------|
1. | 193 4 0 |
2. | 194 5 1 |
3. | 195 6 2 |
4. | 196 0 3 |
5. | 197 1 4 |
6. | 198 2 5 |
7. | 199 3 6 |
+-----------------+
您可以查看Stata自己的dow()
功能,以获取上述DOW
的其他方式
gen StataDOW = dow(day - 2)
所以工作日的指标是(例如)
gen weekday = !inlist(DOW, 0, 6)
或
gen weekday = inrange(DOW, 1, 5)
或
gen weekday = !inlist(dow, 4, 3)
使用创建的第一个变量。
碰巧,我最初写了egen, seq()
。你的语法确实不合法,因为seq()
是语法,但是括号内没有任何内容。我不会在这里使用egen
,只是因为正确的答案基本上不可能出现多次(如你所有),如果你的数据有差距也不太可能。这里的推理是,或应该是重复和差距的强大。