подсчет количества взаимодействий, которые persion_id имеет на основе дат в R, с tidyverse - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь получить количество встреч, которые пациент имел на основании дат. Это необходимо в R и с библиотекой Tidyverse. Пример набора данных здесь:

structure(list(person_id = c(1, 2, 2, 3, 3, 3), arrival = c("2020-01-01 08:00:00", 
    "2020-01-01 09:00:00", NA, "2020-01-01 10:00:00", NA, NA), completed = c("2020-01-01 9:00:00", 
    "2020-01-01 11:00:00", NA, "2020-01-01 11:00:00", NA, NA), admitted = c(NA, 
    NA, "2020-01-01 11:00:00", NA, "2020-01-01 11:00:00", "2020-01-09 11:00:00"
    ), discharged = c(NA, NA, NA, NA, "2020/01/02 12:00:00", "2020-01-13 12:00:00"
    ), encounter_number = c(1, 2, 3, 4, 5, 6)), row.names = c(NA, 
    -6L), class = c("tbl_df", "tbl", "data.frame"))

И пример набора данных в качестве вывода с новым столбцом, который я хочу, будет выглядеть следующим образом:

structure(list(person_id = c(1, 2, 2, 3, 3, 3), arrival = c("2020-01-01 08:00:00", 
"2020-01-01 09:00:00", NA, "2020-01-01 10:00:00", NA, NA), completed = c("2020-01-01 9:00:00", 
"2020-01-01 11:00:00", NA, "2020-01-01 11:00:00", NA, NA), admitted = c(NA, 
NA, "2020-01-01 11:00:00", NA, "2020-01-01 11:00:00", "2020-01-09 11:00:00"
), discharged = c(NA, NA, NA, NA, "2020/01/02 12:00:00", "2020-01-13 12:00:00"
), encounter_number = c(1, 2, 3, 4, 5, 6), person_total_encounter = c(1, 
1, 2, 1, 2, 1)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

Caveats !!

Как вы можете видеть, человек с person_id номер 2 прибывает в AE и заполняется из AE, а затем сразу же поступает в больницу, но без даты выписки. Но все же я даю общее количество встреч, добавляя до 2, один для AE и один для стационарного, опять же даже без даты выписки. Кроме того, человек с person_id 3 допускается дважды в разные даты, но общее количество встреч составляет до 2, а затем 1 для последнего приема. Может кто-то помочь мне с этим?

1 Ответ

1 голос
/ 22 апреля 2020

Вот одна мысль. Если это не то, что вы имели в виду, пожалуйста, дайте мне знать.

Во-первых, вы можете поместить ваши данные в длинный формат с event в один столбец (для прибытия, завершения, приема, выписки) и date во втором столбце. И удалите NA, которые не влияют на результаты.

Затем вы можете отфильтровать события, которые вы будете считать sh. В этом случае я выбрал выполненный и принят.

Далее вы можете group_by и person_id и date (просто дата без времени). person_total_encounter будет row_number, который является просто текущим счетчиком или последовательностью событий для этого date и person_id.

Редактировать : добавлено select в начало, поскольку исходный набор данных, описанный OP, вероятно, имеет дополнительные столбцы.

library(tidyverse)

df1 %>%
  select(person_id, encounter_number, arrival, completed, admitted, discharged) %>%
  pivot_longer(cols = c(arrival, completed, admitted, discharged), names_to = "event", values_to = "date") %>%
  drop_na() %>%
  filter(event == "completed" | event == "admitted") %>%
  group_by(person_id, date = as.Date(date)) %>%
  mutate(person_total_encounter = row_number()) %>%
  ungroup %>%
  select(-c(event, date)) %>%
  right_join(df1, by = c("person_id", "encounter_number"))

Вывод

# A tibble: 6 x 7
  person_id encounter_number person_total_encounter arrival             completed           admitted            discharged         
      <dbl>            <dbl>                  <int> <chr>               <chr>               <chr>               <chr>              
1         1                1                      1 2020-01-01 08:00:00 2020-01-01 09:00:00 NA                  NA                 
2         2                2                      1 2020-01-01 09:00:00 2020-01-01 11:00:00 NA                  NA                 
3         2                3                      2 NA                  NA                  2020-01-01 11:00:00 NA                 
4         3                4                      1 2020-01-01 10:00:00 2020-01-01 11:00:00 NA                  NA                 
5         3                5                      2 NA                  NA                  2020-01-01 11:00:00 2020-01-02 12:00:00
6         3                6                      1 NA                  NA                  2020-01-09 11:00:00 2020-01-13 12:00:00
...