计算没有循环的时间窗口的观察次数

时间:2019-02-12 14:43:01

标签: performance loops if-statement stata

我正在尝试计算一个时间窗口内的观察次数,特别是到达时间1小时之前和到达时间1小时之后。

我尝试了以下代码进行20观察:

local N=_N
quietly forval i = 1/`N' {
    count if (arrivaltime >= arrivaltime[`i']-(1000*60*60) & ///
    arrivaltime<=arrivaltime[`i']+(1000*60*60)) 
    replace countcall = r(N) in `i'
}

代码可以正常运行,但是我的数据集由250,000个obs组成,并且此循环耗时超过1.5小时。

我的数据如下:

clear
input double(makeid arrivaltime)
  1 1.7398209e+12
  2 1735689960000
  3 1735690260000
  4 1735690560000
  5 1.7356908e+12
  6 1735692060000
  7 1735692540000
  8 1735693620000
  9 1735695060000
 10 1735695780000
 11 1735696020000
 12 1735697640000
 13 1735697640000
 14 1735698540000
 15 1735700160000
 16 1735700460000
 17 1735700460000
 18 1735701240000
 19 1735701540000
 20 1735701720000
 21 1735702980000
 22 1735703160000
 23 1735704060000
 24 1735704420000
 25 1735705440000
 26 1735705860000
 27 1735706040000
 28 1735706160000
 29 1735706580000
 30 1.7357067e+12
 31 1735706940000
 32 1735708140000
 33 1.7357097e+12
 34   1.73571e+12
 35 1.7357106e+12
 36 1.7357067e+12
 37 1735711440000
 38 1.7357118e+12
 39 1735715280000
 40 1.7357154e+12
 41 1735716720000
 42 1735717380000
 43 1735717620000
 44 1735717980000
 45 1735718940000
 46 1735720380000
 47 1735722480000
 48 1735723140000
 49 1.7357238e+12
 50 1735724040000
 51 1735725060000
 52 1.7357256e+12
 53 1735725780000
 54 1735726080000
 55 1.7357268e+12
 56 1.7357271e+12
 57 1735727820000
 58 1735728240000
 59 1735728480000
 60 1735729502000
 61 1735729655000
 62 1735729920000
 63 1735729944000
 64 1735730280000
 65 1735730520000
 66 1735731060000
 67 1735731240000
 68 1735731360000
 69 1735731420000
 70 1735731840000
 71 1.7357319e+12
 72 1735732680000
 73 1.7357328e+12
 74 1735732860000
 75 1735732860000
 76 1735733160000
 77 1735733520000
 78 1735734060000
 79 1735734180000
 80 1735734720000
 81 1735734852000
 82 1735735030000
 83 1735735140000
 84 1.7357352e+12
 85 1.7357352e+12
 86 1735735920000
 87 1735735980000
 88 1735736450000
 89 1735736520000
 90 1735736760000
 91 1735736824000
 92 1735737060000
 93 1735737232000
 94 1735737360000
 95 1735737540000
 96 1735737681000
 97 1735737780000
 98 1735738006000
 99 1735738260000
100 1735738384000
end
format %tc arrivaltime

我已经尝试过egen命令:

egen count_patients=count if (arrivaltime >= arrivaltime[_n]-(1000*60*60) & ///
arrivaltime<=arrivaltime[_n]+(1000*60*60)) 

但是,这将为所有行提供_N

将感谢您提出更有效的方法的建议。

1 个答案:

答案 0 :(得分:1)

您可以使用社区贡献的命令rangestat

rangestat (count) makeid, int(arrival -3.6e6 3.6e6)

您可以按照以下步骤从SSC安装它:

ssc inst rangestat