我想从一些开始和结束日期创建虚拟变量,如果在范围内,则取值为1。例如,来自
id start end
1 01072014 05072014
1 05012014 06012015
我想得到
id start end d_01012014 d_02012014 d_03012014 ... d_01052014 ... d_31122014
1 01012014 02012014 1 1 0 0 0
1 01052014 02052015 0 0 0 1 0
因此,我最终可以重塑我的数据,将所有观察结果从日期范围中删除。 我的想法是使用带有stata日期格式的循环,有点像这样:
foreach i in *stataformat startdate*/*stataformat enddate* {
generate d_`i'=1 if `i'>=start & `i'<=end
}
但是这个方法的问题是我的变量会有无可比拟的名字。那么你是建议另一种方法,还是想知道如何将包含stata日期代码的变量重命名为“可理解的”名称? 非常感谢!
答案 0 :(得分:4)
如果我想从第一个原则开始,我将从长格式数据开始:
clear
input id spell str10 start str10 end
1 1 "01-07-2014" "05-07-2014"
1 2 "06-08-2014" "06-01-2015"
end
gen start2 = date(start, "MDY")
gen end2 = date(end, "MDY")
format start2 %td
format end2 %td
sum start2
local min = r(min)
sum end2
local range = r(max) - `min' + 1
expand `range'
bys id spell : gen date = `min' + _n - 1
format date %td
keep if date >= start2 & date <= end2
但是,由于这可能是生存分析数据,而您已经stset
数据集(或者您要去),您可以使用stsplit
。