我有一个包含两个变量的数据集:journalistName
,articleDate
对于每个记者(小组),我想创建一个变量,按时间顺序将文章归类为1
,用于"上半年"和2
为"下半年"。
例如,如果一名记者写了4篇文章,我希望前两篇文章归类为1
。
如果他写了5篇文章,我想要前三篇归类为1
的文章。
我想到的一种可能性是计算中点日期,然后使用if条件(gen cat1 = 1 if midpoint > startdate
),但我不知道如何在Stata中生成这样的中点。
答案 0 :(得分:2)
根据您对要归类为1
的文章的描述,您需要查找文章数的中点,而不是日期范围的中点
一种解决方案是使用by
群组处理,_n
和_N
:
gen cat = 2
bysort author (date): replace cat = 1 if _n <= ceil(_N/2)
按author
和date
排序,然后将cat = 1
分配给author
每组中的观察值,其中当前观察值(_n
)为小于或等于中位观察值(ceil(_N/2)
)。
请注意,您需要一个数字(而不是字符串)日期才能使排序正常工作。此外,在我看来,cat = {1,2}
不像firsthalf = {0,1}
那样直观。无论哪种方式,标记值(help label
)都有助于明确。
有关详细信息,请参阅help by
和this 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