代码之家  ›  专栏  ›  技术社区  ›  Student

为重复的日期创建序列

  •  1
  • Student  · 技术社区  · 7 年前

    我有一个天数列表(编号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次)。

         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)
    

    然而,斯塔塔告诉我,这有一个语法错误。注意:我以“2”开头,因为我的第一天(195)是星期二。我还考虑了以下命令: carryforward mod(x,y) fill

    有人知道我如何设置每天的顺序吗?如何修复此代码以实现所需的输出?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Nick Cox    7 年前

    如果你知道195年是星期二,那么逆向工程很简单。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 |
         +-----------------+
    

    你可以和斯塔塔自己核实一下 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 在这里,如果仅仅是因为正确的答案在多次出现的情况下基本上是不可能的(正如你所做的那样),并且如果数据中存在差距,也不太可能。这里的推理是,或者应该是,对重复和差距的强大。