Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

# RE: st: counting variables within a row

 From "Nick Cox" To Subject RE: st: counting variables within a row Date Wed, 9 Jun 2010 10:00:49 +0100

```I endorse Sarah's approach. Another way of writing the code is to change
a statement like

replace lightcount_d1=lightcount_d1+1 if met_a`num'>0 &
met_a`num'<3

to one like

replace lightcount_d1=lightcount_d1 + (met_a`num'>0 &
met_a`num'<3)

The logic here is that parenthesised expression is evaluated as 1 or 0
according to whether it is true of false. This is mostly a matter of
taste: many may find the first version more transparent, but roughly
speaking the more you program, the more you may like the second version.

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

Sarah Elizabeth Edgington

You could use a foreach loop to assess your criteria for each
variable and then add 1 to a count variable if it's true.  To save
myself some typing I'm going to assume a simpler case where you only
have five variables but you can extend it beyond that to the full
eighteen (note that if you were using variable names with a numeric
suffix like met_a1 you could use a forvalues loop).
To get your first count it might look something like this:

gen lightcount_d1=0
foreach num in one two three four five {
replace lightcount_d1=lightcount_d1+1 if met_a`num'>0 &
met_a`num'<3
}

There may be other ways to do this but this is the first that occurs to
me.

Casey P. Durand

>I have a dataset with 18 variables called met_aone-met_aeighteen.
>Within each observation, I'm trying to count the number of these
>variables with values which satisfy three criteria.  I thought I could
>handle this with -egen- and the lines of code I originally wrote are:
>
>egen lightcount_d1= rownonmiss ( met_aone-met_aeighteen) if (
>met_aone-met_aeighteen)> 0 & ( met_aone-met_aeighteen)< 3
>egen modcount_d1= rownonmiss (met_aone-met_aeighteen) if
>(met_aone-met_aeighteen)>= 3.0000 & (met_aone-met_aeighteen)< 6
>egen hardcount_d1= rownonmiss (met_aone-met_aeighteen) if
>(met_aone-met_aeighteen)>= 6.0000 & (met_aone-met_aeighteen)< .
>
>The problem as I quickly realized is that it is only counting
>variables when every single value in the row satisfies the if
>requirement.  What I can't figure out is how to assess each variable
>individually for meeting the criteria, but ultimately producing a new
>variable with the total within the observation which meets my
>criteria.

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