【发布时间】:2026-02-02 23:30:01
【问题描述】:
我正在使用以下数据集: 图书馆(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 中不同患者接受药物的开始时间和结束时间。
我正在尝试构建一个函数:
- 对于每个唯一的患者(每个唯一的 icusstay_id),合并停止服药不到一小时的行。
- 当行合并时: 某些列将保留相同的值(即患者标识符) 必须修改某些列:
- 保持较早的开始时间
- 保留后一个 endttime
- 平均血管速率
- 总血管量
- 删除持续时间
我在第二部分苦苦挣扎,我似乎找不到解决这种有条件“合并”的最佳方法。
要获得类似的东西:
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
注意在此示例中,icusstay 1 的患者情况如何:仅对连续结束时间-开始时间差 1 小时与其他人的差异)保持未分组。
这是我目前所拥有的。我尝试为满足上述条件的患者添加一个额外的组列,然后最终 group_by 这个条件。
但它不起作用......
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)
}
【问题讨论】:
-
您好,截图不是分享数据的好方法。以下是创建良好 minimal reproducible example 的方法(即,将您的数据分享给 SO 以更快地获得帮助)。
-
谢谢,会注意的!!
-
我无法理解您示例中的分组条件。你不应该根本没有分组吗,因为对于
icustay_id == 1,所有观察都有endtime - starttime > 1 hour,除了第1行吗? -
是的,你是对的@SamuelDiebolt,我错了。我修改了示例。
-
是的。我更改了我的示例 df 来说明这一点,并修改了我的 notice 评论!再次感谢,对不清楚的地方深表歉意!
标签: r merge conditional-statements tidyr