如何计算可变输注率的每日输液量

时间:2019-05-05 19:38:02

标签: r

在R中工作时,我需要在输液速率(mL / hour)可变的情况下计算每日输液量(mL)。

我的数据框有两列:更改输液速度的日期(年,月,日,小时,分钟,秒)和新输液速度(ml /小时)。根据这些数据,我计算出了整个研究(约3周)的累积输注量。我现在需要计算从午夜到午夜每24小时的输液量。前一天和最后一天的学习时间少于24小时,因此被排除在外。

我不知道该如何解决午夜24小时内的输液速度问题。

一个想法是生成一个新的数据帧,该数据帧包括以秒为单位的时间(从零到研究结束)和每秒注入的体积,然后每天求和总体积。当然,这将生成一个大的(不必要的)数据帧(> 100万行)。

我正在寻找有关如何使用R的方向。

目前没有可共享的代码。我的数据框已共享:https://drive.google.com/file/d/1YfZkuOStOxWIXrxklWEo1r46hjFQPIXM/view

DF <- structure(list(`date&time` = structure(c(1519043251, 1519047111, 
1519049877, 1519050201, 1519053454, 1519054180, 1519060742, 1519062334, 
1519083584, 1519108892, 1519114732, 1519118888, 1519127198, 1519140960, 
1519142031, 1519150508, 1519161027, 1519167167, 1519206508, 1519206877, 
1519222879, 1519278875, 1519290863, 1519293411, 1519314864, 1519317665, 
1519334695, 1519364934, 1519364996, 1519378625, 1519384577, 1519428049, 
1519495090, 1519541667, 1519544091, 1519551993, 1519594678, 1519626216, 
1519650059, 1519658045, 1519712871, 1519722853, 1519726863, 1519744270, 
1519786071, 1519787755, 1519788820, 1519789685, 1519791798, 1519801303, 
1519801380, 1519809813, 1519815924, 1519826260, 1519830433, 1519833629, 
1519841284, 1519857415, 1519885051, 1519885120, 1519885141, 1519887091, 
1519939049, 1519939482, 1519945740, 1519971397, 1519975527, 1519987363, 
1519988481, 1520004464, 1520033974, 1520093329, 1520179994, 1520204550, 
1520233073, 1520237983, 1520238103, 1520241519, 1520241904, 1520263216, 
1520290670, 1520349278, 1520370509, 1520406514, 1520436434, 1520447318, 
1520456518, 1520461383, 1520501027, 1520522600, 1520542062, 1520590191, 
1520618693, 1520621059, 1520626341, 1520627226, 1520630596, 1520637370, 
1520664044, 1520676143, 1520689466, 1520717079, 1520724147, 1520754787, 
1520788241, 1520806426, 1520818840, 1520829807, 1520839843, 1520839936, 
1520891100, 1520897458, 1520921676, 1520933752), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), `infusion rate` = c(25.75, 30.75, 
25.75, 25.81, 25.81, 25.75, 25.65, 25.65, 27.55, 18.47, 18.25, 
16.25, 15.25, 13.25, 13.25, 15.25, 16.25, 15.25, 15.45, 12.45, 
12.25, 12.45, 11.45, 11.5, 11.57, 13.57, 11.57, 10.57, 10.55, 
11.55, 13.55, 13.52, 13.56, 13.64, 13.7, 13.67, 13.67, 13.65, 
14.65, 14.61, 14.67, 14.69, 13.69, 13.67, 16.67, 21.67, 24.67, 
29.67, 34.67, 29.67, 29.65, 24.65, 22.65, 19.65, 19.65, 17.65, 
14.65, 14.63, 14.65, 15.65, 14.65, 15.65, 16.65, 15.65, 15.68, 
15.71, 15.74, 15.81, 15.92, 15.89, 15.9, 15.94, 15.93, 14.94, 
15.92, 16.03, 15.03, 15, 15.02, 14.96, 14.91, 14.93, 14.94, 14.94, 
14.91, 14.92, 14.92, 14.92, 14.94, 14.95, 15.95, 14.95, 16.95, 
19.95, 22.95, 25.95, 26.95, 26.93, 26.89, 23.89, 20.89, 18.89, 
18.87, 16.87, 15.87, 15.87, 14.87, 17.87, 16.87, 16.98, 17.98, 
16.98, 15.98, 0)), row.names = 2:115, class = "data.frame")

我需要输出为两列数据;以天为单位的时间和每日输液量。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用foverlaps()包中的data.table函数。 foverlaps()通过重叠连接找到所有重叠的间隔(范围,句点):

library(data.table)
# coerce to data.table
setDT(DF)
# rename column names (syntactically correct)
setnames(DF, names(DF) %>% make.names())
DF
# create intervals (ranges) of infusion periods
DF_ranges <- DF[, .(start = head(date.time, -1L), 
                    end = tail(date.time, -1L),
                    inf.rate = head(infusion.rate, -1L))]
setkey(DF_ranges, start, end)
# create sequence of calendar days (starting at midnight)
day_seq <- DF[, seq(lubridate::floor_date(min(date.time), "day"), 
                    max(date.time), "1 day")]
# create intervals of days (from midnight to midnight)
day_ranges <- data.table(start = day_seq, end = day_seq + as.difftime(1, units = "days"))
# find all overlapping intervals (overlap join )
ovl <- foverlaps(day_ranges, DF_ranges)
# compute duration of infusion periods within each day
ovl[, inf.hours := difftime(pmin(end, i.end), pmax(start, i.start), units = "hours")]
# compute infusion volume for each period
ovl[, inf.vol := inf.rate * as.double(inf.hours)]
# aggregate by day
ovl[, .(inf.vol.per.day = sum(inf.vol)), by = .(day = as.Date(i.start))][
  # drop first and last day 
  -c(1L, .N)]
           day inf.vol.per.day
 1: 2018-02-20        455.7107
 2: 2018-02-21        324.6403
 3: 2018-02-22        293.5880
 4: 2018-02-23        298.9512
 5: 2018-02-24        324.7212
 6: 2018-02-25        327.3658
 7: 2018-02-26        338.3609
 8: 2018-02-27        338.1620
 9: 2018-02-28        507.9508
10: 2018-03-01        368.7672
11: 2018-03-02        379.4539
12: 2018-03-03        381.9141
13: 2018-03-04        381.5335
14: 2018-03-05        360.6198
15: 2018-03-06        358.0437
16: 2018-03-07        358.3588
17: 2018-03-08        361.6632
18: 2018-03-09        421.2107
19: 2018-03-10        567.7771
20: 2018-03-11        413.8286
21: 2018-03-12        403.4742
           day inf.vol.per.day

中间结果是

DF_ranges
                   start                 end inf.rate
  1: 2018-02-19 12:27:31 2018-02-19 13:31:51    25.75
  2: 2018-02-19 13:31:51 2018-02-19 14:17:57    30.75
  3: 2018-02-19 14:17:57 2018-02-19 14:23:21    25.75
  4: 2018-02-19 14:23:21 2018-02-19 15:17:34    25.81
  5: 2018-02-19 15:17:34 2018-02-19 15:29:40    25.81
 ---                                                 
109: 2018-03-12 07:30:43 2018-03-12 07:32:16    16.87
110: 2018-03-12 07:32:16 2018-03-12 21:45:00    16.98
111: 2018-03-12 21:45:00 2018-03-12 23:30:58    17.98
112: 2018-03-12 23:30:58 2018-03-13 06:14:36    16.98
113: 2018-03-13 06:14:36 2018-03-13 09:35:52    15.98
day_ranges
         start        end
 1: 2018-02-19 2018-02-20
 2: 2018-02-20 2018-02-21
 3: 2018-02-21 2018-02-22
 4: 2018-02-22 2018-02-23
 5: 2018-02-23 2018-02-24
 6: 2018-02-24 2018-02-25
 7: 2018-02-25 2018-02-26
 8: 2018-02-26 2018-02-27
 9: 2018-02-27 2018-02-28
10: 2018-02-28 2018-03-01
11: 2018-03-01 2018-03-02
12: 2018-03-02 2018-03-03
13: 2018-03-03 2018-03-04
14: 2018-03-04 2018-03-05
15: 2018-03-05 2018-03-06
16: 2018-03-06 2018-03-07
17: 2018-03-07 2018-03-08
18: 2018-03-08 2018-03-09
19: 2018-03-09 2018-03-10
20: 2018-03-10 2018-03-11
21: 2018-03-11 2018-03-12
22: 2018-03-12 2018-03-13
23: 2018-03-13 2018-03-14
         start        end
foverlaps(day_ranges, DF_ranges)
                   start                 end inf.rate    i.start      i.end
  1: 2018-02-19 12:27:31 2018-02-19 13:31:51    25.75 2018-02-19 2018-02-20
  2: 2018-02-19 13:31:51 2018-02-19 14:17:57    30.75 2018-02-19 2018-02-20
  3: 2018-02-19 14:17:57 2018-02-19 14:23:21    25.75 2018-02-19 2018-02-20
  4: 2018-02-19 14:23:21 2018-02-19 15:17:34    25.81 2018-02-19 2018-02-20
  5: 2018-02-19 15:17:34 2018-02-19 15:29:40    25.81 2018-02-19 2018-02-20
 ---                                                                       
131: 2018-03-12 07:32:16 2018-03-12 21:45:00    16.98 2018-03-12 2018-03-13
132: 2018-03-12 21:45:00 2018-03-12 23:30:58    17.98 2018-03-12 2018-03-13
133: 2018-03-12 23:30:58 2018-03-13 06:14:36    16.98 2018-03-12 2018-03-13
134: 2018-03-12 23:30:58 2018-03-13 06:14:36    16.98 2018-03-13 2018-03-14
135: 2018-03-13 06:14:36 2018-03-13 09:35:52    15.98 2018-03-13 2018-03-14
ovl
                   start                 end inf.rate    i.start      i.end        inf.hours    inf.vol
  1: 2018-02-19 12:27:31 2018-02-19 13:31:51    25.75 2018-02-19 2018-02-20  1.0722222 hours  27.609722
  2: 2018-02-19 13:31:51 2018-02-19 14:17:57    30.75 2018-02-19 2018-02-20  0.7683333 hours  23.626250
  3: 2018-02-19 14:17:57 2018-02-19 14:23:21    25.75 2018-02-19 2018-02-20  0.0900000 hours   2.317500
  4: 2018-02-19 14:23:21 2018-02-19 15:17:34    25.81 2018-02-19 2018-02-20  0.9036111 hours  23.322203
  5: 2018-02-19 15:17:34 2018-02-19 15:29:40    25.81 2018-02-19 2018-02-20  0.2016667 hours   5.205017
 ---                                                                                                   
131: 2018-03-12 07:32:16 2018-03-12 21:45:00    16.98 2018-03-12 2018-03-13 14.2122222 hours 241.323533
132: 2018-03-12 21:45:00 2018-03-12 23:30:58    17.98 2018-03-12 2018-03-13  1.7661111 hours  31.754678
133: 2018-03-12 23:30:58 2018-03-13 06:14:36    16.98 2018-03-12 2018-03-13  0.4838889 hours   8.216433
134: 2018-03-12 23:30:58 2018-03-13 06:14:36    16.98 2018-03-13 2018-03-14  6.2433333 hours 106.011800
135: 2018-03-13 06:14:36 2018-03-13 09:35:52    15.98 2018-03-13 2018-03-14  3.3544444 hours  53.604022