Слияние строк в R при добавлении условий в соответствии со значениями столбцов - PullRequest
1 голос
/ 19 октября 2019

Я работаю со следующим набором данных: 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-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.


Я пытаюсь создать функцию, которая будет:

  1. Для каждого отдельного уникального пациента (каждого уникального icustay_id) объединить строки, в которых лечение было остановлено менее чем на час,
  2. Когда строка сливается: некоторые столбцы сохранят одно и то же значение (т. Е. Идентификаторы пациента). Некоторые столбцы необходимо изменить:
  3. Сохранить более раннее время начала
  4. Оставить последнее время окончания
  5. Среднее значение вазо-курса
  6. Сумма вазо-суммы
  7. Удалить длительности

Я борюсь со второй частью, могуКажется, не найти оптимальный способ решения этой условной "слияния".

Чтобы получить что-то вроде:

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_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)
}

1 Ответ

0 голосов
/ 19 октября 2019

Ответ на исходное сообщение (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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...