Вот как я бы подошел к этому, используя набор пакетов 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
для перестановки столбцов, если порядок важен.