Bookmark and Share

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

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

Re: st: Equivalent of Excel's COUNTIF

From   Richard Herron <>
Subject   Re: st: Equivalent of Excel's COUNTIF
Date   Wed, 16 Nov 2011 11:04:43 -0500

Here is an alternative solution with -reshape-, -cond-, and -sum-. The
last two functions should be fast at any scale, but I don't have
enough experience with Stata to know if -reshape- is faster than a

(Thanks to Stas for the data-generating code)

* begin code
set obs 10
set seed 10101
generate int id = _n
generate int datein = ceil(runiform()*50)
generate int dateout = datein + ceil(runiform()*15)

reshape long date, i(id) j(inout) string
sort date
tempvar change
generate int `change' = cond(inout == "in", 1, -1)
generate int total = sum(`change')
* end code

I am still a little confused by Stata's -reshape- and would be
appreciative if someone could get this back to a logical wide format
(I couldn't). Thanks!

On Tue, Nov 15, 2011 at 16:19, Stas Kolenikov <> wrote:
> This is grossly inefficient, as any code with explicit cycling over
> observations is, but it will probably do the work for you:
> clear
> set obs 10
> set seed 10101
> generate int arrival = ceil(runiform()*50)
> generate int discharge = arrival + ceil(runiform()*15)
> gen long npatients = .
> gen long _num_discharged = .
> sort arrival
> isid arrival
> forvalues k=1/`=_N' {
>  replace _num_discharged = sum( discharge <= arrival[`k'] )
>  replace npatients = (_n-1) - _num_discharged[`k'] in `k'
> }
> list
> It is not important that the -arrival- and -discharge- variables are
> generated as integers, but it is important that _num_discharged is as
> accurate as possible. The (_n-1) here is the number of patients who
> have arrived by the time arrival[_n], and we know this since we have
> sorted by -arrival- and checked that all values are unique.
> There may be alternative algorithms that would not require the
> observation-by-observation comparisons, but you would need to create
> some sort of stack of the patients... and that's not really
> straightforward, at least within Stata (but should be doable in Mata).
> On Tue, Nov 15, 2011 at 3:47 PM, Teubner, David (Health)
> <> wrote:
>> Apologies for the slightly long-winded first post.
>> I have a data stet of emergency department presentations for the last 18 years.  The dataset includes numerous variables about individual patient presentations to the department, including time of arrival and time of leaving.  What it does not have is a variable for the number of patients already in the department when each new patient arrives.
>> It seems to me that I could construct this by simply subtracting the number of patients who have left (prior to the time of arrival of a new patient) from the number who have arrived.  I understand how to calculate the number who have arrived (sort by arrival time and use the _n function) but I don't understand how to do the left number.  In Excel I would use COUNTIF(-all arrival times-,<individual patients discharge time).  Is there a way to do this in Stata?
> --
> Stas Kolenikov, also found at
> Small print: I use this email account for mailing lists only.
> *
> *   For searches and help try:
> *
> *
> *

*   For searches and help try:

© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index