Как считать 2 строки как 1 строку, если они имеют одинаковые значения для 2 столбцов? - PullRequest
0 голосов
/ 02 июля 2018

Я хотел бы считать строки как 1 строку, если в пределах одного и того же PATIENT_ID, второй ADMISSION_DATE совпадает с первым ADMISSION_DATE и первым DISCHARGE_DATE.

Это различные случаи, которые у меня есть в наборе данных:

  1. [Основная часть вопроса] Случай 1 : Если пациент поступил в разные INSITUTION_CODE в пределах того же ADMISSION_DATE (т.е. пациент был переведен), мы считаем это как 1 прием и приписать поступление в учреждение с более поздней датой выписки. За PATIENT_ID1 он был принят на A, а затем на D в тот же день. Когда мы делаем подсчет, его ADMISSIONS_NUMBER_TOTAL равен 1, его ADMISSIONS_NUMBER_D равен 1, а его средняя продолжительность пребывания (т.е. ADMISSIONS_AVE_LOS) составляет 3/1 = 3
  2. Случай 2 : Если пациент был госпитализирован и выписан в течение одного дня, мы считаем это за 1 прием. За PATIENT_ID3 он был принят на B, а затем выписан в тот же день. Следовательно, это будет считаться 1 входом. Позже он был принят в B в другой день. Когда мы делаем подсчет, его ADMISSIONS_NUMBER_TOTAL равен 2, его ADMISSIONS_NUMBER_B равен 2, а его средний LOS (т.е. ADMISSIONS_AVE_LOS) равен (0 + 7) / 2 = 3,5
  3. Случай 3 : если DISCHARGE_DATE пациента для первого приема такой же, как и его ADMISSION_DATE для второго приема (т. Е. Пациент пошел домой и вернулся в больницу для другого приема), мы считаем их отдельными приемами , За PATIENT_ID4 он был допущен к C на некоторое время, выписан и затем снова принят. Когда мы делаем подсчеты, его ADMISSIONS_NUMBER_TOTAL равен 2, его ADMISSIONS_NUMBER_C равен 2, а его средний LOS (т.е. ADMISSIONS_AVE_LOS) равен (3 + 7) / 2 = 5

Данные:

df <- read.table(text = "
PATIENT_ID  VISIT_TYPE_DESCRIPTION  INSITUTION_CODE ADMISSION_DATE  DISCHARGE_DATE  LENGTH_OF_STAY  CASE_NO
PATIENT_ID1 Inpatient   A   20130225    20130225    0   CASE_NO1
PATIENT_ID1 Inpatient   D   20130225    20130228    3   CASE_NO2
PATIENT_ID2 Inpatient   A   20130604    20130604    0   CASE_NO3
PATIENT_ID3 Inpatient   B   20130503    20130503    0   CASE_NO4
PATIENT_ID3 Inpatient   B   20130508    20130515    7   CASE_NO5
PATIENT_ID4 Inpatient   C   20130628    20130701    3   CASE_NO6
PATIENT_ID4 Inpatient   C   20130701    20130708    7   CASE_NO7", header = TRUE, stringsAsFactors = FALSE)

Код: Я написал код для обработки этих данных, но он помогает только при адресации 2 и 3, но не 1.

library(dplyr)
df %>% 
  group_by(PATIENT_ID) %>%
  mutate(ADMISSIONS_NUMBER_TOTAL= n(),
         ADMISSIONS_NUMBER_A  = sum(INSITUTION_CODE == "A"),
         ADMISSIONS_NUMBER_B  = sum(INSITUTION_CODE == "B"),
         ADMISSIONS_NUMBER_C  = sum(INSITUTION_CODE == "C"),
         ADMISSIONS_NUMBER_D  = sum(INSITUTION_CODE == "D"),
         ADMISSIONS_NUMBER_E  = sum(INSITUTION_CODE == "E"),
         ADMISSIONS_AVE_LOS   = sum(LENGTH_OF_STAY)/n()) %>%
  slice(1) %>% ungroup() %>%
  select(PATIENT_ID, ADMISSIONS_NUMBER_TOTAL:ADMISSIONS_AVE_LOS)

Требуемые данные:

df <-  read.table(text = "
PATIENT_ID  ADMISSIONS_NUMBER_TOTAL ADMISSIONS_NUMBER_A ADMISSIONS_NUMBER_B ADMISSIONS_NUMBER_C ADMISSIONS_NUMBER_D ADMISSIONS_NUMBER_E ADMISSIONS_AVE_LOS
PATIENT_ID1 1   0   0   0   1   0   3
PATIENT_ID2 1   1   0   0   0   0   0
PATIENT_ID3 2   0   2   0   0   0   3.5
PATIENT_ID4 2   0   0   2   0   0   5", header = TRUE, stringsAsFactors = FALSE)

1 Ответ

0 голосов
/ 02 июля 2018

Вот как я бы подошел к этому, используя набор пакетов tidyverse (включая dplyr, но мне также требовались функции из tidyr и purrr).

Шаг 1: Решить проблему «Случай 1»:

library(tidyverse)
tmp_df <- df %>%
  split(., interaction(.$PATIENT_ID, .$ADMISSION_DATE)) %>% # from base R
  map_df(~ arrange(.x, DISCHARGE_DATE) %>% tail(1)) %>% # from `purrr`
  group_by(PATIENT_ID)

Шаг 2: Рассчитать общие итоги:

df_general <- tmp_df %>% 
    summarize(
      ADMISSIONS_NUMBER_TOTAL= n(),
      ADMISSIONS_AVE_LOS = mean(LENGTH_OF_STAY)
    )

Шаг 3: Рассчитать сводку по конкретному учреждению:

df_inst <- tmp_df %>% 
  mutate(val = 1) %>%
  spread(INSITUTION_CODE, val, fill = 0) %>%  # from tidyr
  summarize_at(vars(A:D), sum) %>%
  select(PATIENT_ID, A:D) %>%
  rename_at(vars(A:D), ~paste0("ADMISSIONS_NUMBER_", .x))

Шаг 4: объединить все вместе:

df_output <- full_join(df_general, df_inst) 

На этом этапе вы можете использовать select для перестановки столбцов, если порядок важен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...