簡體   English   中英

在特定時間段內使用R計算時間序列數據的出現次數的有效方法

[英]Effective ways in Counting Number of Occurrences for a time series data using R in a specific time period

我正在使用R處理來自醫院的時間序列數據

         Time of Arrival    Time of Treatment
         8/1/14 12:14 AM    8/1/14 12:26 AM
         8/1/14 12:22 AM    8/1/14 12:35 AM
         8/1/14 12:47 AM    8/1/14 12:56 AM
         8/1/14 1:07 AM     8/1/14 1:16 AM
         8/1/14 1:19 AM     8/1/14 1:32 AM
         8/1/14 1:53 AM     8/1/14 2:02 AM
          8/1/14 1:56 AM    8/1/14 2:18 AM
          8/1/14 1:58 AM    8/1/14 2:15 AM

這本質上是關於患者到達急診室以及何時接受治療。 我有完整的一年的數據,並正在建立一個基於回歸的模型來預測要治療的患者所花費的時間。 為此,我將整個數據集划分為20分鍾(從12.00 AM到12.20 AM等),並基於此計數在20分鍾的時間范圍內到達了多少患者。 目前,我正在使用兩步過程1.計算兩個特定時期之間的患者人數2.將計算出的人數分配回特定時期。

為了執行第二項任務,我使用以下代碼

     for (i in 1:nrow(date))
      {for (j in 1:nrow(period)){
        if (date[i,1]>=period[j,]){ 
        j=j+1
        z[i,]=t[j,]}
        }
          i=i+1
             }

不幸的是,第二步花了太多時間去做,我想知道是否有什么有效的方法可以執行第二步任務? 我是R的新手,使用兩個級別的for循環會使計算時間過長。

在這方面的任何幫助將不勝感激。

計算給定時間段內有多少患者,如果出現以下情況,我將患者定義為存在:

  • 他在期限結束前到達
  • 期間開始后他會受到治療

將您的數據集從12 AM更改為0 AM:

require(data.table)

text = "arr;tre
8/1/14 0:14 AM;8/1/14 0:26 AM
8/1/14 0:22 AM;8/1/14 0:35 AM
8/1/14 0:47 AM;8/1/14 0:56 AM
8/1/14 1:07 AM; 8/1/14 1:16 AM
8/1/14 1:19 AM; 8/1/14 1:32 AM
8/1/14 1:53 AM; 8/1/14 2:02 AM
8/1/14 1:56 AM;8/1/14 2:18 AM
8/1/14 1:58 AM;8/1/14 2:15 AM"

讀取和解析數據:

dat <- fread(text, sep = ";")
dat[,c("arr", "tre") := .(as.POSIXct(arr, format="%m/%d/%y %H:%M %p"), as.POSIXct(tre, format="%m/%d/%y %H:%M %p"))]
dat[,`:=`(arr_d = as.IDate(arr),
          arr_t = as.ITime(arr),
          tre_d = as.IDate(tre),
          tre_t = as.ITime(tre))]
dat[,c("arr", "tre") := NULL]

您可以使用data.table的新半聯接。 這是data.table 1.9.7的新功能,因此您需要開發版本。 此處找到安裝指南。

使用期間的開始和結束時間創建一個data.table

mp <- data.table(period_start = seq(as.POSIXct("2014-08-01 0:00"), as.POSIXct("2014-08-01 03:00"), by = "20 min"))
mp <- mp[, period_end := shift(period_start, 1, type = "lead")][-.N]
mp[,`:=`(ps_d = as.IDate(period_start),
         ps_t = as.ITime(period_start),
         pe_d = as.IDate(period_end),
         pe_t = as.ITime(period_end))]
mp[,c("period_start", "period_end") := NULL]

運行聯接:

res <- dat[mp,.(ps_d, ps_t, pe_d, pe_t, x.arr_d, x.arr_t, x.tre_d, x.tre_t), 
           on=.(arr_d <= pe_d, arr_t <= pe_t,
                tre_d >= ps_d, tre_t >= ps_t), nomatch=NA, allow.cartesian=TRUE]

看看水庫。 您可以仔細檢查患者的分類。

按period_start計算患者人數

res[,sum(!is.na(x.arr_d)), by=.(ps_d, ps_t)]

結果是:

         ps_d     ps_t V1
1: 2014-07-31 00:00:00  1
2: 2014-07-31 00:20:00  2
3: 2014-07-31 00:40:00  1
4: 2014-07-31 01:00:00  2
5: 2014-07-31 01:20:00  1
6: 2014-07-31 01:40:00  3
7: 2014-08-01 02:00:00  3
8: 2014-08-01 02:20:00  0
9: 2014-08-01 02:40:00  0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM