# RE: st: bys and [_N] within replace

 From Johannes Geyer To statalist@hsphsun2.harvard.edu Subject RE: st: bys and [_N] within replace Date Wed, 18 Mar 2009 14:29:48 +0100

```> I tried your code as well, but it does not replicate the above
> solution, most likely because my statement of the problem was

No, I think that I made an error. I implicitly assumed in my code that
each individual would have an occurrence of "TM Ei-svar" - which might not
be correct.

The following code should produce the same results as Eva's code:

*******************************
bys Id Result2: gen helpvar = _n == 1
egen kun_eisvar = total(helpvar), by(Id)
replace kun_eisvar = kun_eisvar == 1 & Result2 == "TM Ei-svar"
drop helpvar
*******************************

Note that it is not necessary to sort by the time variable. Eva's code
could be written as:

*******************************
gen other =  Result2 != "TM Ei-svar"
bysort Id : replace other = sum(other)
by      Id : gen dummy = other[_N]==0
*******************************

> I am still puzzled about why my code did not work. I thought that I
> could use _N to look forward and _N-1 to look backwards, within Id
> and Commdate.

"_N" simply contains the total number of observations in the dataset or in
your "by id - group".  So -[_N-1]- used as an index means that you refer
to the second last observation in the group you are looking at. And -[_N]-
is the last observation. So you don't step through all observations of an
id if you have more than two realizations of it.

Johannes

owner-statalist@hsphsun2.harvard.edu schrieb am 18/03/2009 14:05:15:

> Johannes, thanks for this.
>
> Eva Poen gave me this code,
>
> gen other =  Result2 != "TM Ei-svar"
> bysort Id (Commdate) : replace other = sum(other)
> by      Id (Commdate) : gen dummy = other[_N]==0
> drop other
>
> which works fine.
>

>
> I am still puzzled about why my code did not work. I thought that I
> could use _N to look forward and _N-1 to look backwards, within Id
> and Commdate.
>
> Anyway, problem solved. Thanks for the help.
>
> Best wishes,
> Alexander Severinsen
>
>
> -----Opprinnelig melding-----
> Fra: owner-statalist@hsphsun2.harvard.edu [mailto:owner-
> statalist@hsphsun2.harvard.edu] På vegne av Johannes Geyer
> Sendt: 18. mars 2009 11:28
> Til: statalist@hsphsun2.harvard.edu
> Emne: Re: st: bys and [_N] within replace
>
> you could do the following:
>
> bys Id Result2: gen helpvar = _n == 1
> egen kun_eisvar = total(helpvar), by(Id)
> replace kun_eisvar = kun_eisvar == 1
> drop helpvar
>
>
> Hope this helps,
>
> Johannes
>
>
>
>
>
> ----------------------
> Johannes Geyer
> Deutsches Institut für Wirtschaftsforschung (DIW Berlin)
> German Institute for Economic Research
> Department of Public Economics
> DIW Berlin
> Mohrenstraße 58
> 10117 Berlin
> Tel: +49-30-89789-258
>
> owner-statalist@hsphsun2.harvard.edu schrieb am 18/03/2009 11:05:24:
>
> > I have the following panel.
> >
> >
> > Id   Commdate   Result2
> > 400   05may2008   TM FAILURE
> > 400   29may2008   DM FAILURE
> > 400   05oct2008   TM Ei-svar
> > 400   27oct2008   TM Ei-svar
> > 400   30nov2008   TM Ei-svar
> > 400   04jan2009   TM Ei-svar
> >
> > I would like to generate a binary variable that equals 1 if a
> > category "TM Ei-svar" within result2 occurs. But I only want this to
> > happen if no other category in Result2 is present within Id, either
> > onwards are backwards in time (Commdate). Nick Cox and Martin Weiss
> > gave excellent advice on an earlier related problem pointing me to
> > 'bys' and using [_N] within replace statements. Nick also refered me
> > to further free 'by' tricks at
> >
> > http://www.stata-journal.com/sjpdf.html?articlenum=pr0004
> >
> > However, I am still unable to solve the above problem. I tried
> >
> > gen kun_eisvar=0
> > bys Id (Commdate):replace kun_eisvar=1 if ///
> >    (result2=="TM Ei-svar"& ///
> >    result2[_N]!="TM FAILURE"&result2[_N-1]!="TM FAILURE"& ///
> >    result2[_N]!="TM SUCCESS"&result2[_N-1]!="TM SUCCESS"& ///
> >    result2[_N]!="SUCCESS DM SMS 1999"&result2[_N-1]!="SUCCESS DM
> SMS1999"& ///
> >    result2[_N]!="DM SUCCESS NY BIND"&result2[_N-1]!="DM SUCCESS NY
> BIND"& ///
> >    result2[_N]!="DM SUCCESS"&result2[_N-1]!="DM SUCCESS"& ///
> >    result2[_N]!="DM FAILURE"&result2[_N-1]!="DM FAILURE")
> >
> > though, this does not work. See an example below.
> >
> > Id   Commdate   Result2   kun_eisvar
> > 400   05may2008   TM FAILURE   0
> > 400   29may2008   DM FAILURE   0
> > 400   05oct2008   TM Ei-svar   1
> > 400   27oct2008   TM Ei-svar   1
> > 400   30nov2008   TM Ei-svar   1
> > 400   04jan2009   TM Ei-svar   1
> >
> > Because Result2 has other categories than 'TM Ei-svar' for Id=400
> > this observation should not equal 1.
> >
> > Any advice on where I went wrong is appreciated.
> >
> >
> > Best wishes,
> > Alexander
> >
> >
> >
> >
> >
> > *
> > *   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/
>
>
> *
> *   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/
>
> *
> *   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/

*
*   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/
```