You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

600 lines
19KB

  1. ---
  2. title: CRHAP
  3. runtime: shiny
  4. output:
  5. html_document:
  6. toc: true
  7. toc_float: true
  8. ---
  9. ```{r init, warning = F, message = F, echo = F}
  10. library(tidyverse)
  11. library(DT)
  12. library(magrittr)
  13. library(stringr)
  14. library(knitr)
  15. library(lubridate)
  16. library(plotly)
  17. opts_chunk$set(warning = F,
  18. message = F,
  19. fig.width = 9,
  20. fig.height = 6,
  21. echo = F)
  22. options(DT.options = list(paging = F,
  23. info = F,
  24. searching = F,
  25. dom = "Bfrtip",
  26. buttons = c('copy', 'excel')),
  27. shiny.maxRequestSize = 500*1024^2)
  28. pdf(NULL)
  29. ```
  30. # {.tabset}
  31. ## Méthode
  32. ### Chargement des données
  33. Le fichier doit être fournis au format CSV avec les paramètres suivants :
  34. * séparateur de champs = ,
  35. * guillemets = "
  36. * encodage = UTF-8
  37. * séparateur de décimales = ,
  38. Il doit être issu de la [requête suivante](https://livenne.chu-nancy.fr/shiny_files/CRHAP/CRHAP.wid).
  39. ```{r data}
  40. if (!dir.exists("/var/www/html/shiny_files/CRHAP"))
  41. dir.create("/var/www/html/shiny_files/CRHAP")
  42. file.copy("CRHAP.wid", "/var/www/html/shiny_files/CRHAP", overwrite = T) -> null
  43. inputPanel(
  44. numericInput("mois", "Mois", (Sys.Date() %>% month) - 1),
  45. numericInput("annee", "Année", Sys.Date() %>% year),
  46. fileInput("crhap", "CRHAP", accept = "text/csv"),
  47. actionButton("report", "Publier le rapport")
  48. )
  49. CRH <- reactive(
  50. {
  51. req(input$crhap, input$annee, input$mois)
  52. read_csv(input$crhap$datapath, col_types = cols(`Numéro d'hospitalisation` = col_character()), progress = F) %>%
  53. setNames(c("RUM", "NDA", "DP", "GHM", "Notes", "Pole", "Service", "Date_DP", "Date_sortie")) %>%
  54. mutate(Notes = Notes %>%
  55. str_to_upper %>%
  56. str_replace_all(" ", "") %>%
  57. str_replace("CHR", "CRH") %>%
  58. str_extract("CRH."),
  59. Notes = ifelse(Notes %in% c("CRHP", "CRHA"), Notes, NA),
  60. Date_DP = as.Date(Date_DP),
  61. Date_sortie = as.Date(Date_sortie),
  62. Delai = as.numeric(Date_DP - Date_sortie),
  63. Pole = ifelse(Pole == "GSP : GÉRONTOLOGIE ET SOINS PALLIATIFS", "GSP", Pole),
  64. Pole = ifelse(Pole == "POLE LORRAIN DE CHIRURGIE DE L'APPAREIL LOCOMOTEUR", "CCEG", Pole)) %>%
  65. filter(!(Service %in% c("MEDECINE INFANTILE", "NEPHROLOGIE") & DP == "Z49.1"),
  66. !(Service %in% c("AMP CLINIQUE", "ORTHOGENIE"))) %>%
  67. filter(Date_sortie < ceiling_date(as.Date(str_c(input$annee, "-", input$mois, "-01")), unit = "month"),
  68. Date_sortie > floor_date(as.Date(str_c(input$annee - 1, "-", input$mois, "-01")), unit = "month")) %>%
  69. mutate(Notes = ifelse(Service == "STRUCTURE D'URGENCES" & Delai <= 15 & is.na(Notes), "CRHP", Notes),
  70. Mois = str_c(year(Date_sortie), "-", str_pad(month(Date_sortie), 2, "left", "0")))
  71. }
  72. )
  73. CRH_sans_seance <- reactive(
  74. {
  75. req(CRH())
  76. CRH() %>%
  77. filter(!(GHM %>% str_detect("^28")))
  78. }
  79. )
  80. CRH_seance <- reactive(
  81. {
  82. req(CRH())
  83. CRH() %>%
  84. filter(GHM %>% str_detect("^28"))
  85. }
  86. )
  87. mois_label <- c("Janvier",
  88. "Février",
  89. "Mars",
  90. "Avril",
  91. "Mai",
  92. "Juin",
  93. "Juillet",
  94. "Août",
  95. "Septembre",
  96. "Octobre",
  97. "Novembre",
  98. "Décembre")
  99. ```
  100. ```{r report}
  101. observeEvent(input$report,
  102. {
  103. rmarkdown::render("CRHAP.Rmd", output_file = "/var/www/html/cloture/crhap.html", params = list(CRH = CRH(), CRH_seance = CRH_seance(), CRH_sans_seance = CRH_sans_seance()))
  104. showModal(modalDialog(title = "Publication", p("Fichier disponible", a("ici", href = "https://livenne.chu-nancy.fr/sitedim/index.php/clot/presence-crh")), easyClose = T, footer = NULL))
  105. })
  106. ```
  107. ### Présence du CRH pour le codage des séjours
  108. Ces tableaux concernent les RUMs sur une année glissante.
  109. Les RUMs **sans DP** et **codés en erreur** (CMD 90) sont **exclus** de l'analyse.
  110. Le pourcentage d'absents est calculé sur la **totalité** des RUMs, *Non renseignés* compris.
  111. Le délai médian est le délai médian entre la date de fin du RSS et la date de codage du DP pour le RUM.
  112. Les données sont disponibles avec les **séances incluses**, et les **séances excluses**.
  113. Les séances automatiquement codées (dialyse en néphrologie et médecine infantile) sont *exclues*.
  114. Les séjours en AMP clinique et orthogénie sont également *exclus*.
  115. Les séjours automatiquement codés d'UHCD (séjour en UHCD avec délai de codage <= 15j et sans marque de codage) sont considérés comme *#CRHP*.
  116. Il est possible pour chaque tableau de **trier** chaque colonne en cliquant sur son intitulé.
  117. Pour les tableaux par service, il est également possible de **filtrer** par pôle ou selon les valeurs (par exemple, ne faire apparaître que les services avec plus de 50% de CRH absents).
  118. Les tableaux sont **exportables** sous Excel à l'aide du bouton en haut à gauche de chaque tableau.
  119. **Attention : les *tris* et *filtres* sont pris en compte pour l'export !**
  120. ----
  121. ### Saisie
  122. Les marques **#CRHA** (CRH absent) et **#CRHP** (CRH présent) sont saisies dans les **Notes** lors du codage des séjours dans WebPIMS.
  123. #### Format
  124. Les marques sont saisies selon le format suivant :
  125. * marque en début de Notes
  126. * précédée du #
  127. * tout attaché
  128. * attention aux fautes de frappe ! (#C*HR*P, #CR*PH*)
  129. * **seules ces marques seront analysées !**
  130. #### Conditions
  131. Les marques sont saisies selon les conditions suivantes :
  132. * **\#CRHP** dès lors qu'un compte-rendu permettant le codage du séjour est présent :
  133. * au moins un CRH lors de l'hospitalisation
  134. * CRH papier accepté
  135. * CRH au «mauvais» format accepté
  136. * CRH pour venues multiples (séances) accepté
  137. * **\#CRHA** dès lors qu'il n'existe aucun compte-rendu d'aucune forme permettant le codage du séjour, et **en respectant un délai d'au moins une semaine après la fin de l'hospitalisation**.
  138. Il est recommandé de coder les séjours par ordre **chronologique**.
  139. ----
  140. ### Analyse
  141. #### Extraction
  142. Les marques sont extraites par le médecin DIM responsable de la clôture, à l'aide d'une requête BO dans l'univers **WebPIMS MCO Prod**. Cette requête est exécutée tous les mois, *une semaine après la clôture mensuelle*. Les marques sont tirées des RUMs remplissant les conditions suivantes :
  143. * RUM de RSS sorti durant la période allant du début de ce recueil (avril 2016) à la fin du mois de la dernière clôture
  144. * les RUMs sans DP (non codés) sont *exclus*
  145. * les RUMs de RSS groupés en erreur sont *exclus*
  146. #### Traitement
  147. Les données extraites sont séparées en trois groupes pour l'analyse :
  148. * tous RUMs confondus
  149. * RUMs séances uniquement
  150. * RUMs à l'exclusion des séances
  151. Pour chaque jeu de données, les tableaux suivants sont générés :
  152. * par mois de sortie du **RSS**
  153. * par pôle
  154. * par service
  155. Chaque tableau présente les indicateurs suivants :
  156. * le nombre de RUMs dans le mois/pôle/service concerné
  157. * le nombre de RUMs avec marque #CRHP
  158. * le nombre de RUMs avec marque #CRHA
  159. * le nombre de RUMs non marqués
  160. * le **pourcentage de #CRHA**, calculé par rapport au nombre total de RUMs (y compris RUMs non marqués)
  161. ## Rapport
  162. ### Tous RUMs confondus
  163. #### Par mois
  164. ```{r}
  165. renderDataTable({
  166. CRH() %>%
  167. count(Mois, Notes) %>%
  168. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  169. spread(Notes, n) %>%
  170. full_join(CRH() %>% count(Mois)) %>%
  171. select(Mois, RUM = n, CRHP, CRHA, Manquant) %>%
  172. full_join(CRH() %>% group_by(Mois) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  173. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  174. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  175. `% absents` = CRHA / RUM) %>%
  176. datatable(rownames = F,
  177. extensions = 'Buttons',
  178. colnames = c("Non renseigné" = "Manquant",
  179. "#CRHA" = "CRHA",
  180. "#CRHP" = "CRHP")) %>%
  181. formatPercentage(7)
  182. })
  183. ```
  184. <br/>
  185. ```{r}
  186. renderPlotly({
  187. CRH() %>%
  188. ggplot(aes(x = Mois, fill = Notes)) +
  189. geom_bar(position = "fill") +
  190. ylab("Proportion") +
  191. theme(axis.text.x = element_text(angle = -45, hjust = 1)) +
  192. ggtitle("Proportion des #CRHA et #CRHP par mois de sortie du RSS") -> p
  193. ggplotly(p)
  194. })
  195. ```
  196. #### Par Pôle
  197. ```{r}
  198. renderDataTable({
  199. CRH() %>%
  200. count(Pole, Notes) %>%
  201. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  202. spread(Notes, n) %>%
  203. full_join(CRH() %>% count(Pole)) %>%
  204. select(Pole, RUM = n, CRHP, CRHA, Manquant) %>%
  205. full_join(CRH() %>% group_by(Pole) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  206. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  207. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  208. `% absents` = CRHA / RUM) %>%
  209. datatable(rownames = F,
  210. extensions = 'Buttons',
  211. colnames = c("Pôle" = "Pole",
  212. "Non renseigné" = "Manquant",
  213. "#CRHA" = "CRHA",
  214. "#CRHP" = "CRHP")) %>%
  215. formatPercentage(7)
  216. })
  217. ```
  218. <br/>
  219. ```{r}
  220. renderPlotly({
  221. CRH() %>%
  222. ggplot(aes(x = Pole, fill = Notes)) +
  223. geom_bar(position = "fill") +
  224. ylab("Proportion") +
  225. ggtitle("Proportion des #CRHA et #CRHP par pôle, depuis avril 2016") +
  226. theme(axis.text.x = element_text(angle = -45, hjust = 1)) -> p
  227. ggplotly(p)
  228. })
  229. ```
  230. #### Par Pôle, par service et par mois
  231. ```{r}
  232. renderDataTable({
  233. CRH() %>%
  234. count(Pole, Service, Mois, Notes) %>%
  235. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  236. spread(Notes, n) %>%
  237. full_join(CRH() %>% count(Pole, Service, Mois)) %>%
  238. ungroup %>%
  239. select(Pole, Service, Mois, RUM = n, CRHP, CRHA, Manquant) %>%
  240. full_join(CRH() %>% group_by(Pole, Service, Mois) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  241. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  242. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  243. `% absents` = CRHA / RUM,
  244. Pole = Pole %>% factor,
  245. Mois = Mois %>% factor) %>%
  246. datatable(rownames = F,
  247. extensions = 'Buttons',
  248. colnames = c("Pôle" = "Pole",
  249. "Non renseigné" = "Manquant",
  250. "#CRHA" = "CRHA",
  251. "#CRHP" = "CRHP"),
  252. filter = "top",
  253. options = list(searching = T, paging = T)) %>%
  254. formatPercentage(9)
  255. })
  256. ```
  257. <br/>
  258. ```{r}
  259. renderPlotly({
  260. CRH() %>%
  261. count(Pole, Mois, Notes) %>%
  262. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  263. spread(Notes, n) %>%
  264. mutate(Manquant = ifelse(is.na(Manquant), integer(1), Manquant),
  265. CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  266. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  267. pourcent = CRHA / (CRHA + CRHP + Manquant)) %>%
  268. ggplot(aes(x = Mois, y = pourcent, colour = Pole, group = Pole)) +
  269. geom_line(stat = "identity") +
  270. geom_point() +
  271. theme(axis.text.x = element_text(angle = -45, hjust = 1)) +
  272. ylab("Proportion de #CRHA") +
  273. ggtitle("Évolution des proportions de #CRHA par pôle") -> p
  274. ggplotly(p, tooltip = c("x", "y", "colour"))
  275. })
  276. ```
  277. ----
  278. ### RUMs non séance
  279. #### Par mois
  280. ```{r}
  281. renderDataTable({
  282. CRH_sans_seance() %>%
  283. count(Mois, Notes) %>%
  284. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  285. spread(Notes, n) %>%
  286. full_join(CRH_sans_seance() %>% count(Mois)) %>%
  287. select(Mois, RUM = n, CRHP, CRHA, Manquant) %>%
  288. full_join(CRH_sans_seance() %>% group_by(Mois) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  289. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  290. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  291. `% absents` = CRHA / RUM) %>%
  292. datatable(rownames = F,
  293. extensions = 'Buttons',
  294. colnames = c("Non renseigné" = "Manquant",
  295. "#CRHA" = "CRHA",
  296. "#CRHP" = "CRHP")) %>%
  297. formatPercentage(7)
  298. })
  299. ```
  300. <br/>
  301. ```{r}
  302. renderPlotly({
  303. CRH_sans_seance() %>%
  304. ggplot(aes(x = Mois, fill = Notes)) +
  305. geom_bar(position = "fill") +
  306. theme(axis.text.x = element_text(angle = -45, hjust = 1)) +
  307. ylab("Proportion") +
  308. ggtitle("Proportion des #CRHA et #CRHP par mois de sortie du RSS") -> p
  309. ggplotly(p)
  310. })
  311. ```
  312. #### Par Pôle
  313. ```{r}
  314. renderDataTable({
  315. CRH_sans_seance() %>%
  316. count(Pole, Notes) %>%
  317. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  318. spread(Notes, n) %>%
  319. full_join(CRH_sans_seance() %>% count(Pole)) %>%
  320. select(Pole, RUM = n, CRHP, CRHA, Manquant) %>%
  321. full_join(CRH_sans_seance() %>% group_by(Pole) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  322. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  323. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  324. `% absents` = CRHA / RUM) %>%
  325. datatable(rownames = F,
  326. extensions = 'Buttons',
  327. colnames = c("Pôle" = "Pole",
  328. "Non renseigné" = "Manquant",
  329. "#CRHA" = "CRHA",
  330. "#CRHP" = "CRHP")) %>%
  331. formatPercentage(7)
  332. })
  333. ```
  334. <br/>
  335. ```{r}
  336. renderPlotly({
  337. CRH_sans_seance() %>%
  338. ggplot(aes(x = Pole, fill = Notes)) +
  339. geom_bar(position = "fill") +
  340. ylab("Proportion") +
  341. ggtitle("Proportion des #CRHA et #CRHP par pôle, depuis avril 2016") +
  342. theme(axis.text.x = element_text(angle = -45, hjust = 1)) -> p
  343. ggplotly(p)
  344. })
  345. ```
  346. #### Par Pôle, par service et par mois
  347. ```{r}
  348. renderDataTable({
  349. CRH_sans_seance() %>%
  350. count(Pole, Service, Mois, Notes) %>%
  351. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  352. spread(Notes, n) %>%
  353. full_join(CRH_sans_seance() %>% count(Pole, Service, Mois)) %>%
  354. ungroup %>%
  355. select(Pole, Service, Mois, RUM = n, CRHP, CRHA, Manquant) %>%
  356. full_join(CRH_sans_seance() %>% group_by(Pole, Service, Mois) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  357. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  358. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  359. `% absents` = CRHA / RUM,
  360. Pole = Pole %>% factor,
  361. Mois = Mois %>% factor) %>%
  362. datatable(rownames = F,
  363. extensions = 'Buttons',
  364. colnames = c("Pôle" = "Pole",
  365. "Non renseigné" = "Manquant",
  366. "#CRHA" = "CRHA",
  367. "#CRHP" = "CRHP"),
  368. filter = "top",
  369. options = list(searching = T, paging = T)) %>%
  370. formatPercentage(9)
  371. })
  372. ```
  373. <br/>
  374. ```{r}
  375. renderPlotly({
  376. CRH_sans_seance() %>%
  377. count(Pole, Mois, Notes) %>%
  378. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  379. spread(Notes, n) %>%
  380. mutate(Manquant = ifelse(is.na(Manquant), integer(1), Manquant),
  381. CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  382. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  383. pourcent = CRHA / (CRHA + CRHP + Manquant)) %>%
  384. ggplot(aes(x = Mois, y = pourcent, colour = Pole, group = Pole)) +
  385. geom_line(stat = "identity") +
  386. geom_point() +
  387. theme(axis.text.x = element_text(angle = -45, hjust = 1)) +
  388. ylab("Proportion de #CRHA") +
  389. ggtitle("Évolution des proportions de #CRHA par pôle") -> p
  390. ggplotly(p, tooltip = c("x", "y", "colour"))
  391. })
  392. ```
  393. ----
  394. ### RUMs séance
  395. #### Par mois
  396. ```{r}
  397. renderDataTable({
  398. CRH_seance() %>%
  399. count(Mois, Notes) %>%
  400. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  401. spread(Notes, n) %>%
  402. full_join(CRH_seance() %>% count(Mois)) %>%
  403. select(Mois, RUM = n, CRHP, CRHA, Manquant) %>%
  404. full_join(CRH_seance() %>% group_by(Mois) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  405. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  406. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  407. `% absents` = CRHA / RUM) %>%
  408. datatable(rownames = F,
  409. extensions = 'Buttons',
  410. colnames = c("Non renseigné" = "Manquant",
  411. "#CRHA" = "CRHA",
  412. "#CRHP" = "CRHP")) %>%
  413. formatPercentage(7)
  414. })
  415. ```
  416. <br/>
  417. ```{r}
  418. renderPlotly({
  419. CRH_seance() %>%
  420. ggplot(aes(x = Mois, fill = Notes)) +
  421. geom_bar(position = "fill") +
  422. theme(axis.text.x = element_text(angle = -45, hjust = 1)) +
  423. ylab("Proportion") +
  424. ggtitle("Proportion des #CRHA et #CRHP par mois de sortie du RSS") -> p
  425. ggplotly(p)
  426. })
  427. ```
  428. #### Par Pôle
  429. ```{r}
  430. renderDataTable({
  431. CRH_seance() %>%
  432. count(Pole, Notes) %>%
  433. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  434. spread(Notes, n) %>%
  435. full_join(CRH_seance() %>% count(Pole)) %>%
  436. select(Pole, RUM = n, CRHP, CRHA, Manquant) %>%
  437. full_join(CRH_seance() %>% group_by(Pole) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  438. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  439. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  440. `% absents` = CRHA / RUM) %>%
  441. datatable(rownames = F,
  442. extensions = 'Buttons',
  443. colnames = c("Pôle" = "Pole",
  444. "Non renseigné" = "Manquant",
  445. "#CRHA" = "CRHA",
  446. "#CRHP" = "CRHP")) %>%
  447. formatPercentage(7)
  448. })
  449. ```
  450. <br/>
  451. ```{r}
  452. renderPlotly({
  453. CRH_seance() %>%
  454. ggplot(aes(x = Pole, fill = Notes)) +
  455. geom_bar(position = "fill") +
  456. ylab("Proportion") +
  457. ggtitle("Proportion des #CRHA et #CRHP par pôle, depuis avril 2016") +
  458. theme(axis.text.x = element_text(angle = -45, hjust = 1)) -> p
  459. ggplotly(p)
  460. })
  461. ```
  462. #### Par Pôle, par service et par mois
  463. ```{r}
  464. renderDataTable({
  465. CRH_seance() %>%
  466. count(Pole, Service, Mois, Notes) %>%
  467. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  468. spread(Notes, n) %>%
  469. full_join(CRH_seance() %>% count(Pole, Service, Mois)) %>%
  470. ungroup %>%
  471. select(Pole, Service, Mois, RUM = n, CRHP, CRHA, Manquant) %>%
  472. full_join(CRH_seance() %>% group_by(Pole, Service, Mois) %>% summarise(`Délai médian (j)` = median(Delai))) %>%
  473. mutate(CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  474. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  475. `% absents` = CRHA / RUM,
  476. Pole = Pole %>% factor,
  477. Mois = Mois %>% factor) %>%
  478. datatable(rownames = F,
  479. extensions = 'Buttons',
  480. colnames = c("Pôle" = "Pole",
  481. "Non renseigné" = "Manquant",
  482. "#CRHA" = "CRHA",
  483. "#CRHP" = "CRHP"),
  484. filter = "top",
  485. options = list(searching = T, paging = T)) %>%
  486. formatPercentage(9)
  487. })
  488. ```
  489. <br/>
  490. ```{r}
  491. renderPlotly({
  492. CRH_seance() %>%
  493. count(Pole, Mois, Notes) %>%
  494. mutate(Notes = ifelse(is.na(Notes), "Manquant", Notes)) %>%
  495. spread(Notes, n) %>%
  496. mutate(Manquant = ifelse(is.na(Manquant), integer(1), Manquant),
  497. CRHA = ifelse(is.na(CRHA), integer(1), CRHA),
  498. CRHP = ifelse(is.na(CRHP), integer(1), CRHP),
  499. pourcent = CRHA / (CRHA + CRHP + Manquant)) %>%
  500. ggplot(aes(x = Mois, y = pourcent, colour = Pole, group = Pole)) +
  501. geom_line(stat = "identity") +
  502. geom_point() +
  503. theme(axis.text.x = element_text(angle = -45, hjust = 1)) +
  504. ylab("Proportion de #CRHA") +
  505. ggtitle("Évolution des proportions de #CRHA par pôle") -> p
  506. ggplotly(p, tooltip = c("x", "y", "colour"))
  507. })
  508. ```