如何计算"中点日期" Stata的小组?

时间:2015-09-15 19:28:44

标签: date time stata

我有一个包含两个变量的数据集:journalistNamearticleDate

对于每个记者(小组),我想创建一个变量,按时间顺序将文章归类为1,用于"上半年"和2为"下半年"。

例如,如果一名记者写了4篇文章,我希望前两篇文章归类为1

如果他写了5篇文章,我想要前三篇归类为1的文章。

我想到的一种可能性是计算中点日期,然后使用if条件(gen cat1 = 1 if midpoint > startdate),但我不知道如何在Stata中生成这样的中点。

1 个答案:

答案 0 :(得分:2)

根据您对要归类为1的文章的描述,您需要查找文章数的中点,而不是日期范围的中点

一种解决方案是使用by群组处理,_n_N

gen cat = 2
bysort author (date): replace cat = 1 if _n <= ceil(_N/2)

authordate排序,然后将cat = 1分配给author每组中的观察值,其中当前观察值(_n)为小于或等于中位观察值(ceil(_N/2))。

请注意,您需要一个数字(而不是字符串)日期才能使排序正常工作。此外,在我看来,cat = {1,2}不像firsthalf = {0,1}那样直观。无论哪种方式,标记值(help label)都有助于明确。

有关详细信息,请参阅help bythis article

最后,实施方法:

clear all
input str10 author str10 datestr
"Alex" "09may2015"
"Alex" "06apr2015"
"Alex" "15jul2014"
"Alex" "19aug2013"
"Alex" "03mar2009"
"Betty" "09may2015"
"Betty" "06apr2015"
"Betty" "15jul2014"
"Betty" "19aug2013"
end

gen date = daily(datestr, "DMY")
format date %td

gen cat = 2
bysort author (date): replace cat = 1 if _n <= ceil(_N/2)

list , sepby(author) noobs

和结果

  +--------------------------------------+
  | author     datestr        date   cat |
  |--------------------------------------|
  |   Alex   03mar2009   03mar2009     1 |
  |   Alex   19aug2013   19aug2013     1 |
  |   Alex   15jul2014   15jul2014     1 |
  |   Alex   06apr2015   06apr2015     2 |
  |   Alex   09may2015   09may2015     2 |
  |--------------------------------------|
  |  Betty   19aug2013   19aug2013     1 |
  |  Betty   15jul2014   15jul2014     1 |
  |  Betty   06apr2015   06apr2015     2 |
  |  Betty   09may2015   09may2015     2 |
  +--------------------------------------+

如果您确实想要计算中点日期,可以使用相同的一般原则来实现:

bysort author (date): gen beforemiddate = date <= ceil((date[_N] + date[1]) / 2)

另外,要找到&#34; pre-midpoint&#34;中的最后一个日期。期间,你可以使用相同的原则:

bysort author cat (date): gen lastdate = date[_N] if cat == 1
by author: replace lastdate = lastdate[_n-1] if missing(lastdate)
format lastdate %td

或包含逻辑测试的egen函数可以更快地完成工作:

egen lastdate = max(date * (cat == 1)) , by(author)
format lastdate %td