我有这样的数据集:
对于每个"公司ID" (此处仅考虑公司ID 123)," nameenddate" 是最后有效的公司名称历史结构的日期。它设置为下一个名称结构的" date" 之前的日期。
我想获得与公司ID相关联的每个"名称" 的开始日期和结束日期。我的理想输出如下:
使用:
bys permno name: egen start = min(date)
bys permno name: egen end = max(enddate)
只会产生错误的结果:
有什么方法可以解决这个问题吗?
答案 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
为你提出要求。