当有" gap"时,如何生成开始和结束日期?在变量的值中

时间:2017-09-21 01:23:47

标签: stata

我有这样的数据集:

|日期|名字| nameenddate |公司ID |

| 15jan1991 | A | 30jan1991 | 123 |

| 31jan1991 | A | 12dec1993 | 123 |

| 13dec1993 | B | 30jan1995 | 123 |

| 31jan1995 | A | 15mar1998 | 123 |

| 15mar1998 | A | 30jan1999 | 123 |

对于每个"公司ID" (此处仅考虑公司ID 123)," nameenddate" 是最后有效的公司名称历史结构的日期。它设置为下一个名称结构的" date" 之前的日期。

我想获得与公司ID相关联的每个"名称" 的开始日期和结束日期。我的理想输出如下:

|日期|名字| nameenddate |公司ID |开始|结束|

| 15jan1991 | A | 30jan1991 | 123 | 15jan1991 | 12dec1993 |

| 31jan1991 | A | 12dec1993 | 123 | 15jan1991 | 12dec1993 |

| 13dec1993 | B | 30jan1995 | 123 | 13dec1993 | 30jan1995 |

| 31jan1995 | A | 15mar1998 | 123 | 31jan1995 | 30jan1999 |

| 16mar1998 | A | 30jan1999 | 123 | 31jan1995 | 30jan1999 |

使用:

bys permno name: egen start = min(date)
bys permno name: egen end = max(enddate)

只会产生错误的结果:

|日期|名字| nameenddate |公司ID |开始|结束|

| 15jan1991 | A | 30jan1991 | 123 | 15jan1991 | 30jan1999 |

| 31jan1991 | A | 12dec1993 | 123 | 15jan1991 | 30jan1999 |

| 31jan1995 | A | 15mar1998 | 123 | 31jan1995 | 30jan1999 |

| 16mar1998 | A | 30jan1999 | 123 | 31jan1995 | 30jan1999 |

| 13dec1993 | B | 30jan1995 | 123 | 13dec1993 | 30jan1995 |

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

示例很清楚,尽管如下所示,需要一些工程才能将人们自己的Stata显示为数据。请注意dataex安装ssc install dataex,以便将示例数据显示为人们可以运行的代码。

这里的主要技巧是识别常量name的法术或运行,之后问题是by:的常规应用。

* engineering to get data example in own Stata 
clear 
input str9 sdate str1 name str9 snameenddate company_id 
 15jan1991   A     30jan1991      123        
 31jan1991   A     12dec1993      123        
 13dec1993   B     30jan1995      123        
 31jan1995   A     15mar1998      123        
 15mar1998   A     30jan1999      123        
end 

foreach v in date nameenddate {
    gen `v' = daily(s`v', "DMY") 
    format `v' %td 
    drop s`v' 
}

* spell counter: every time name changes, add 1 
bysort company_id (date) : gen spell = sum(name != name[_n-1]) 

* get first and last dates in each spell 
bysort company_id spell (date) : gen start = date[1] 
by company_id spell: gen end = nameenddate[_N] 
format start end %td 

list, sepby(company_id spell) 

     +-------------------------------------------------------------------------+
     | name   compan~d        date   nameend~e   spell       start         end |
     |-------------------------------------------------------------------------|
  1. |    A        123   15jan1991   30jan1991       1   15jan1991   12dec1993 |
  2. |    A        123   31jan1991   12dec1993       1   15jan1991   12dec1993 |
     |-------------------------------------------------------------------------|
  3. |    B        123   13dec1993   30jan1995       2   13dec1993   30jan1995 |
     |-------------------------------------------------------------------------|
  4. |    A        123   31jan1995   15mar1998       3   31jan1995   30jan1999 |
  5. |    A        123   15mar1998   30jan1999       3   31jan1995   30jan1999 |
     +-------------------------------------------------------------------------+

有关拼写识别的原则,请参阅this paper,同时使用by:下的下标,请参阅该命令的用户手册[U]中的部分或this paper

您尝试的代码仅适用于每个company_id每个不同的name只有一个咒语的bysort company_id (date) : replace date = date + 1 if date == nameenddate[_n-1]

注意:

click on elements and scrape data before the page has fully loaded

为你提出要求。