我正在使用以下数据集: 图书馆(tidyverse) 库(润滑)
df <- data.frame(
icustay_id = c(1, 1, 1, 2, 3),
starttime = as.POSIXct(c("2019-09-10 13:20", "2019-09-11 13:30", "2019-09-14 16:40", "2019-09-10 12:40", "2019-09-10 01:20")),
endtime = as.POSIXct(c("2019-09-10 13:20", "2019-09-12 01:20", "2019-09-15 16:40", "2019-09-13 13:20", "2019-09-11 13:20")),
vaso_rate = sample(1:10, 5, replace = TRUE),
vaso_amount = runif(5, 0, 1000)
)
df
# icustay_id starttime endtime vaso_rate vaso_amount
# 1 1 2019-09-10 13:20:00 2019-09-11 13:20:00 3 293.0896
# 2 1 2019-09-11 13:30:00 2019-09-12 01:20:00 9 602.9983
# 3 1 2019-09-14 16:40:00 2019-09-15 16:40:00 4 208.9360
# 4 2 2019-09-10 12:40:00 2019-09-13 13:20:00 2 864.1494
# 5 3 2019-09-10 01:20:00 2019-09-11 13:20:00 9 405.2939
基本上,这显示了POSIXCT中不同患者所用药物的开始时间和结束时间。
我正在尝试构建一个将:
我正在为第二部分苦苦挣扎,我似乎找不到解决这种条件“合并”的最佳方法。
要获得类似的信息:
df
# icustay_id starttime endtime vaso_rate vaso_amount
# 1 1 2019-09-10 13:20:00 2019-09-12 01:20:00 3 293.0896
# 2 1 2019-09-14 16:40:00 2019-09-15 16:40:00 4 208.9360
# 3 2 2019-09-10 12:40:00 2019-09-13 13:20:00 2 864.1494
# 4 3 2019-09-10 01:20:00 2019-09-11 13:20:00 9 405.2939
通知在此示例中,患有icustay 1的患者如何:仅将连续的结束时间-开始时间差小于1小时的事件分组,而将第三次或更远的事件(大于1小时的事件分组)差异)保持未分组状态。
这是我到目前为止所拥有的。我尝试为满足上述条件的患者添加一个附加的组列,然后最终通过此条件进行group_。
但是它不起作用...
merge_pressor_doses <- function(df){
df %>% arrange(icustay_id,starttime)
a <- 1
for (i in unique(df$icustay_id))
{
for (j in which(df$icustay_id==i) && j < max(which(df$icustay_id==i)))
{
df%>%mutate(group = ifelse(df$starttime[j+1]-df$endtime[j] < 60, a, 0))
}
}
df%>%group_by(group) %>%
summarise(
starttime = min(starttime),
endtime = max(endtime),
vaso_rate = mean(vaso_rate),
sum_vaso_amount = sum(vaso_amount))
return(df)
}
答案 0 :(得分:0)
endtime - starttime < 1H
)您要查找的不是行合并,而是按患者分组后某些列的摘要。我使用您的屏幕截图构建了一个玩具数据集(请参阅我的评论以了解如何共享您的数据样本):
library(tidyverse)
library(lubridate)
df <- data.frame(
icustay_id = c(1, 1, 1, 2, 3),
starttime = as.POSIXct(c("2019-09-10 13:20", "2019-09-10 15:20", "2019-09-10 16:40", "2019-09-10 12:40", "2019-09-10 01:20")),
endtime = as.POSIXct(c("2019-10-10 13:20", "2019-12-10 01:20", "2019-09-15 16:40", "2019-09-13 13:20", "2019-09-11 13:20")),
vaso_rate = sample(1:10, 5, replace = TRUE),
vaso_amount = runif(5, 0, 1000)
)
df
# icustay_id starttime endtime vaso_rate vaso_amount
# 1 1 2019-09-10 13:20:00 2019-10-10 13:20:00 3 293.0896
# 2 1 2019-09-10 15:20:00 2019-12-10 01:20:00 9 602.9983
# 3 1 2019-09-10 16:40:00 2019-09-15 16:40:00 4 208.9360
# 4 2 2019-09-10 12:40:00 2019-09-13 13:20:00 2 864.1494
# 5 3 2019-09-10 01:20:00 2019-09-11 13:20:00 9 405.2939
然后我按病人(icustay_id
分组,并总结使用summarise
中的dplyr
函数指定的变量。
df %>%
group_by(icustay_id) %>%
summarise(
starttime = min(starttime),
endtime = max(endtime),
avg_vaso_rate = mean(vaso_rate),
sum_vaso_amount = sum(vaso_amount)
)
# A tibble: 3 x 5
# icustay_id starttime endtime avg_vaso_rate sum_vaso_amount
# <dbl> <dttm> <dttm> <dbl> <dbl>
# 1 1 2019-09-10 13:20:00 2019-12-10 01:20:00 5.33 1105.
# 2 2 2019-09-10 12:40:00 2019-09-13 13:20:00 2 864.
# 3 3 2019-09-10 01:20:00 2019-09-11 13:20:00 9 405.