【问题标题】:Counting the number of observations for a time window without loop计算没有循环的时间窗口的观察次数
【发布时间】:2019-02-12 14:43:01
【问题描述】:

我正在尝试计算时间窗口内的观察次数,特别是到达时间之前的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

不胜感激有关更有效方法的建议。

【问题讨论】:

  • 这甚至是不合法的——没有egen函数调用——所以你必须输入不同的东西。 egen 的帮助明确指出您不应该在 egen 调用中引用下标,尽管它不一定是致命的。我猜你有办法计算 x 是否介于 x - ax + a 之间,这总是正确的,跨度>

标签: performance loops if-statement stata


【解决方案1】:

您可以使用 community-contributed 命令rangestat

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

您可以按如下方式从 SSC 安装它:

ssc inst rangestat 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多