使用同一日期的多个剂量条目计算每日剂量

Calculating daily dose using multiple dose entries from same date

对于这个问题,我将不胜感激任何人的帮助和建议

第一个数据框包含给予患者的药物以及给药日期。我需要 运行 通过此数据框并计算每个 id 每种药物的每日剂量,以便输出的数据框类似于第二个数据框。

第一个数据帧

structure(list(id = c(1010001, 1010001, 1010001, 1010001, 1010001, 
1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 
1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 
1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 
1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 
1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 1010002, 
1010002, 1010002, 1010002, 1010002, 1010002), drug = c("Furosemide", 
"Furosemide", "Furosemide", "Furosemide", "Furosemide", "Magnesium Sulfate", 
"Methylprednisolone", "Methylprednisolone", "Morphine", "Acetaminophen", 
"Acetaminophen", "Acetaminophen", "Acetaminophen", "Cefazolin", 
"Cefazolin", "Furosemide", "Ganciclovir", "Ganciclovir", "Methylprednisolone", 
"Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Mycophenolate Mofetil", "Mycophenolate Mofetil", "Nystatin Mouthwash", 
"Nystatin Mouthwash", "Nystatin Mouthwash", "Nystatin Mouthwash", 
"Nystatin Mouthwash", "Nystatin Mouthwash", "Nystatin Mouthwash", 
"Nystatin Mouthwash", "Ranitidine", "Ranitidine", "Ranitidine", 
"Ranitidine", "Furosemide", "Lorazepam", "Magnesium Sulfate", 
"Sodium Phosphate", "Acetaminophen", "Dimenhydrinate", "Dimenhydrinate", 
"Dimenhydrinate", "Dimenhydrinate", "Fentanyl", "Fentanyl", "Hydralazine", 
"Hydralazine", "Hydralazine", "Hydralazine", "Hydralazine", "Hydralazine", 
"Nifedipine", "Nifedipine", "Nifedipine", "Nifedipine", "Nifedipine", 
"Nifedipine", "Nifedipine", "Nifedipine", "Ondansetron", "Ondansetron", 
"Ondansetron", "Ondansetron", "Ondansetron", "Ondansetron", "Ondansetron", 
"CMV Immune Globulin", "CMV Immune Globulin", "Cefazolin", "Cefazolin", 
"Cefazolin", "Cefazolin", "Cefazolin", "Cefazolin", "Cefazolin", 
"Cefazolin", "Cefazolin", "Cefazolin", "Cefazolin", "Cefazolin", 
"Furosemide", "Ganciclovir", "Ganciclovir", "Ganciclovir", "Ganciclovir", 
"Ganciclovir", "Ganciclovir", "Ganciclovir", "Ganciclovir", "Ganciclovir", 
"Ganciclovir", "Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Methylprednisolone", "Methylprednisolone", "Methylprednisolone", 
"Mycophenolate Mofetil", "Mycophenolate Mofetil", "Mycophenolate Mofetil", 
"Mycophenolate Mofetil", "Mycophenolate Mofetil", "Mycophenolate Mofetil", 
"Mycophenolate Mofetil", "Mycophenolate Mofetil", "Mycophenolate Mofetil", 
"Nystatin Mouthwash", "Nystatin Mouthwash", "Nystatin Mouthwash", 
"Nystatin Mouthwash", "Nystatin Mouthwash", "Nystatin Mouthwash", 
"Nystatin Mouthwash", "Nystatin Mouthwash", "Nystatin Mouthwash", 
"Nystatin Mouthwash", "Nystatin Mouthwash", "Nystatin Mouthwash", 
"Nystatin Mouthwash", "Nystatin Mouthwash", "Nystatin Mouthwash", 
"Ranitidine", "Ranitidine", "Ranitidine", "Ranitidine", "Ranitidine", 
"Ranitidine", "Ranitidine", "Ranitidine", "Ranitidine", "Ranitidine", 
"Ranitidine", "Ranitidine", "Ranitidine", "Ranitidine", "Tacrolimus", 
"Tacrolimus", "Tacrolimus", "Tacrolimus", "Tacrolimus", "Tacrolimus", 
"Tacrolimus", "Tacrolimus", "Tacrolimus", "Furosemide", "Lorazepam", 
"Midazolam", "Midazolam", "Propofol", "Propofol", "Acetaminophen", 
"Midazolam", "Midazolam", "Midazolam", "Ondansetron", "Propofol", 
"Propofol", "Propofol", "Calcium Carbonate", "Calcium Carbonate", 
"Calcium Carbonate", "Cotrimoxazole", "Cotrimoxazole", "Magnesium Hydroxide", 
"Mycophenolate Mofetil", "Mycophenolate Mofetil", "Mycophenolate Mofetil", 
"Mycophenolate Mofetil", "Omeprazole", "Omeprazole", "Omeprazole", 
"Omeprazole", "Oxybutynin", "Oxybutynin", "Oxybutynin", "Oxybutynin", 
"Prednisone", "Prednisone", "Prednisone", "Tacrolimus", "Tacrolimus", 
"Tacrolimus"), date = structure(c(1145404800, 1145404800, 1145404800, 
1145491200, 1145491200, 1145318400, 1145318400, 1145404800, 1145318400, 
1145404800, 1145404800, 1145491200, 1145491200, 1145404800, 1145491200, 
1145491200, 1145318400, 1145404800, 1145404800, 1145404800, 1145404800, 
1145491200, 1145491200, 1145491200, 1145491200, 1145404800, 1145491200, 
1145318400, 1145404800, 1145404800, 1145404800, 1145404800, 1145491200, 
1145491200, 1145491200, 1145404800, 1145404800, 1145491200, 1145491200, 
1212105600, 1212019200, 1211932800, 1212364800, 1211932800, 1211932800, 
1212019200, 1212105600, 1212278400, 1211932800, 1211932800, 1212105600, 
1212192000, 1212192000, 1212192000, 1212192000, 1212278400, 1212192000, 
1212278400, 1212278400, 1212278400, 1212278400, 1212278400, 1212364800, 
1212364800, 1211932800, 1212019200, 1212105600, 1212105600, 1212192000, 
1212278400, 1212364800, 1212019200, 1212105600, 1211932800, 1212019200, 
1212105600, 1212105600, 1212192000, 1212192000, 1212192000, 1212278400, 
1212278400, 1212278400, 1212364800, 1212364800, 1212105600, 1212019200, 
1212105600, 1212105600, 1212105600, 1212105600, 1212192000, 1212278400, 
1212278400, 1212364800, 1212364800, 1211932800, 1212019200, 1212019200, 
1212019200, 1212105600, 1212105600, 1212105600, 1212105600, 1212192000, 
1212192000, 1212192000, 1212192000, 1212278400, 1212278400, 1212278400, 
1212364800, 1212364800, 1212364800, 1212105600, 1212105600, 1212105600, 
1212192000, 1212192000, 1212192000, 1212278400, 1212278400, 1212364800, 
1212019200, 1212105600, 1212105600, 1212105600, 1212105600, 1212192000, 
1212192000, 1212192000, 1212192000, 1212278400, 1212278400, 1212278400, 
1212278400, 1212364800, 1212364800, 1211932800, 1212019200, 1212019200, 
1212105600, 1212105600, 1212192000, 1212192000, 1212192000, 1212278400, 
1212278400, 1212278400, 1212364800, 1212364800, 1212364800, 1212105600, 
1212105600, 1212105600, 1212105600, 1212192000, 1212192000, 1212278400, 
1212278400, 1212364800, 1212192000, 1223942400, 1224028800, 1224028800, 
1224028800, 1224028800, 1224115200, 1224028800, 1224028800, 1224028800, 
1224115200, 1224028800, 1224028800, 1224028800, 1224028800, 1224028800, 
1224115200, 1224028800, 1224115200, 1224028800, 1224028800, 1224028800, 
1224028800, 1224115200, 1224028800, 1224028800, 1224028800, 1224115200, 
1224028800, 1224028800, 1224028800, 1224115200, 1224028800, 1224028800, 
1224115200, 1224028800, 1224028800, 1224115200), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), dose = c(40, 10, 12, 20, 20, 6, 46, 
46, 60, 500, 500, 500, 500, 1000, 1000, 20, 60, 60, 23, 23, 23, 
23, 23, 23, 23, 500, 500, 1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 
1e+05, 1e+05, 1e+05, 50, 50, 50, 50, 5, 2, 10, 10, 500, 20, 20, 
20, 20, 50, 50, 5, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, 
4, 4, 4, 4, 4, 4, 4, 7500, 7500, 1000, 1000, 1000, 1000, 1000, 
1000, 1000, 1000, 1000, 1000, 1000, 1000, 10, 56, 56, 112, 112, 
112, 112, 112, 112, 112, 112, 45, 45, 23, 23, 23, 23, 23, 23, 
20, 23, 20, 23, 20, 20, 20, 20, 20, 20, 400, 400, 400, 400, 400, 
400, 400, 400, 400, 1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 
1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 1e+05, 
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 1, 1, 
4, 4, 1, 1.3, 1.3, 1.3, 1.3, 5, 4, 4, 4, 25, 25, 650, 4, 4, 4, 
4, 25, 25, 25, 200, 200, 200, 80, 80, 130, 750, 750, 750, 750, 
20, 20, 20, 20, 5, 5, 5, 5, 12.5, 12.5, 12.5, 4, 4, 4), units = c("mg", 
"mg", "mg", "mg", "mg", "mmol", "mg", "mg", "mcg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", NA, "mg", 
"mg", "mg", "mg", "mg", "mg", NA, "U", "U", "U", "U", "U", "U", 
"U", "mg", "mg", "mg", "mg", "mg", "mg", "mmol", "mmol", "mg", 
"mg", "mg", "mg", "mg", "mcg", "mcg", "mg", "mg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", NA, "mg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", 
"mg", "mg", "mg", NA, "mg", "mg", "mg", "mg", "mg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", NA, "mg", 
"mg", "mg", "mg", "U", "U", "U", "U", "U", "U", "U", "U", "U", 
"U", "U", "U", "U", "U", "U", "mg", "mg", "mg", "mg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "ng", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", 
NA, "mg", "mg", NA, "mg", "mg", "mg", "mg", "mg", "mg", NA, "mg", 
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg")), row.names = c(NA, 
-199L), class = c("tbl_df", "tbl", "data.frame"))

第二个数据帧

structure(list(id = c(1010001, 1010001, 1010001, 1010001, 1010001, 
1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 1010001, 
1010001), drug = c("Furosemide", "Furosemide", "Magnesium Sulfate", 
"Methylprednisolone", "Methylprednisolone", "Morphine", "Acetaminophen", 
"Acetaminophen", "Cefazolin", "Cefazolin", "Ganciclovir", "Ganciclovir", 
"Methylprednisolone"), date = structure(c(1145404800, 1145491200, 
1145318400, 1145318400, 1145404800, 1145318400, 1145404800, 1145491200, 
1145404800, 1145491200, 1145318400, 1145404800, 1145404800), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), dailydose = c(62, 60, 6, 46, 46, 60, 
1000, 1000, 1000, 1000, 60, 60, 69), units = c("mg", "mg", "mmol", 
"mg", "mg", "mcg", "mg", "mg", "mg", "mg", "mg", "mg", "mg")), row.names = c(NA, 
-13L), class = c("tbl_df", "tbl", "data.frame"))

如果需要任何更多信息,请随时发表评论,我会尽快回复您。

library(dplyr)

df1 %>% 
  group_by(id, drug, date) %>% 
  summarise(dailydose = sum(dose, na.rm = T),
            units = first(units))

我认为您的第二个数据框(期望的结果)不完整。但这可以在 aggregate:

基础上完成
> df2 <- aggregate(dose ~ id + drug + date + units, data=df1, FUN=sum)
> head(df2)

       id               drug       date units dose
1 1010001           Morphine 2006-04-18   mcg   60
2 1010002           Fentanyl 2008-05-28   mcg  100
3 1010001        Ganciclovir 2006-04-18    mg   60
4 1010001 Methylprednisolone 2006-04-18    mg   46
5 1010001      Acetaminophen 2006-04-19    mg 1000
6 1010001          Cefazolin 2006-04-19    mg 1000