Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down on April 23, and its replacement, statalist.org is already up and running.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: st: fill or expand data


From   Nick Cox <n.j.cox@durham.ac.uk>
To   "'statalist@hsphsun2.harvard.edu'" <statalist@hsphsun2.harvard.edu>
Subject   RE: st: fill or expand data
Date   Tue, 12 Oct 2010 22:10:40 +0100

Eric gave an excellent precise example formulation. This code is in his spirit but omits a loop over observations and any restructuring of the data other than -expand- in place. 

clear
inp id  str14(yearenter   yearexit)    yearcont
1  "10/80"             "2/81"           81
1  "3/81"                "4/81"          81
1 "11/85"             "2/87"          87
end

foreach x of var yeare* { 
	g `x'2 = date(`x', "M19Y") 
	g `x'3 = year(`x'2) 
	format `x'2 %tdMon_CCYY 
}

l 
gen nexpand = yearexit3 - yearenter3 + 1 
expand nexpand
drop nexpand 
bysort id yearenter yearexit : replace yearcont = yearenter3[1] + _n - 1 
l

Nick 
n.j.cox@durham.ac.uk 

Eric Booth

Be sure to show us what you've tried.   I don't think -tsfill- can be used to get the target dataset you describe.

Here's one way to get your target dataset:

***********************!
//input your dataset//
clear
inp id  str14(yearenter   yearexit)    yearcont
1  "10/80"             "2/81"           81
1  "3/81"                "4/81"          81
1 "11/85"             "2/87"          87
end

//first, put your dates into a format stata understands//
ds yeare*
foreach x in `r(varlist)' {
g `x'2 = date(`x', "M19Y")
format `x'2 %tdMon_CCYY
}


//create range of years and reshape//
g range = ""
forval n = 1/`=_N' {
	local start = year(yearenter2) in `n'
	local stop = year(yearexit2) in `n'
	di "`start' to `stop'"
	numlist "`start'(1)`stop'"
	replace range = "`r(numlist)'" in `n'
	}
split range, p(" ")
drop range yearenter yearexit
g i = _n
reshape long range, i(i) j(obs)
drop i
drop if mi(range)
l

On Oct 12, 2010, at 12:16 PM, <nicostat@gmail.com>

> My question is about to display or fill my data set. I have tried the
> command tsfill but I don't know how  continue to arrive at my final
> data set.
> I have  this data:
> id  year enter   year exit    yearcont
> 1  10/80             2/81           81
> 1  3/81                4/81          81
> 1 11/85             2/87          87
> 
> And I want to have this one
> 
> id  year enter   year exit    yearcont
> 1  10/80               3/81           80
> 1   10/80              3/81            81
> 1   3/81               4/81             81
> 1   11/85             2/87             85
> 1    11/85            2/87            86
> 1  11/85             2/87              87


*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index