为有重复的日期创建一个序列
Create a sequence for dates with repeats
我有一个天数列表(编号为 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。但是,这不起作用,因为我没有可以使用的原始 "date" 变量。相反,我只有一个数字“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
这样的命令。
有谁知道如何设置每天填充相同的序列?我怎样才能修复此代码以获得所需的输出?
如果您知道 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
,只是因为正确的答案基本上不可能多次出现(正如你所做的那样),而且如果你在数据中有差距也不太可能。这里的推理是,或者应该是,对重复和差距是稳健的。
我有一个天数列表(编号为 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。但是,这不起作用,因为我没有可以使用的原始 "date" 变量。相反,我只有一个数字“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
这样的命令。
有谁知道如何设置每天填充相同的序列?我怎样才能修复此代码以获得所需的输出?
如果您知道 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
,只是因为正确的答案基本上不可能多次出现(正如你所做的那样),而且如果你在数据中有差距也不太可能。这里的推理是,或者应该是,对重复和差距是稳健的。