Stata:如何修改字符串变量中的某些值但保留原始值?

时间:2018-03-21 16:16:33

标签: stata

我正在处理一个非常大的数据集(100万个障碍物)。

我的字符串日期如下所示

key seq startdate (string)  
AD07    1   August 2011 
AD07    2   June 2011   
AD07    3   February 2004   
AD07    4   November 2004   
AD07    5   2001    
AD07    6   January 1998    
AD5c23  1   January 2014    
AD5c235 2   February 2014   
AD5c235 3   2014    

这些是自我报告的就业日期。

有些人没有报告他们开始的月份。 但我想将AD07日期“2001”替换为“2001年1月”。因此我不能简单地替换它,因为我想保留原始年份,但在字符串变量中添加月份。

我开始时:

levelsof start if start<="2016", local(levels)

这给了我从1900年到2016年没有月份的所有年份。

现在我想在没有月份的情况下添加“1月”,并保留原始年份。

如果不每年使用replace,我该怎么做? foreach循环?

1 个答案:

答案 0 :(得分:0)

如果人们声称自己在1900年开始工作并且从那时起每年开始工作,那么您就会遇到严重的数据质量问题!即使考虑到早期就业开始和延迟退休,这意味着人们的年龄超过了最老的年龄。

此外,影响&#34; 1月&#34;会产生偏见,因为几乎所有的工作时间都会比以前更长。真正的1月份开始是正确的,但没有其他人:&#34; 6月&#34;或&#34; 7月&#34;或随机月份会产生更明显的统计意义。

那就是说,这里不需要循环。你要求一行,比如

replace startdate = "January " + startdate if length(trim(date)) == 4 

replace startdate = "January " + startdate if real(startdate) < . 

- 假设跟进转换为数字日期。逻辑是,所有仅限年份的日期减少到4个字符,或者(更好)将月份名称添加到real()将产生缺失。

反过来说,创建一个新变量比覆盖一个变量更好。另外,请考虑丢掉月份细节。需要它吗?

编辑

如果同一年没有月份规格的人有两个或两个以上的工作,您可能会遇到其他问题。你不想把所有有关月份归咎于&#34; 1月和#34;。您可以通过

检查此类观察结果
gen byte incomplete = real(startdate) < . 
gen year = substr(trim(startdate), -4, 4) 
bysort key year incomplete : gen byte multiplebad = incomplete & _N > 1