我正在使用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至上午12.20,依此类推),并根据这一统计,在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点更改为上午0点:
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]
请查看res.您可以仔细检查患者的分类。
按时段统计患者人数_启动
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