J'ai un dataframe qui a des scores d'enquête mensuels pour certains hôpitaux. Chaque mois, nous stockons le score obtenu par l'hôpital ( Voici un échantillon court de ce qu'il ressemble - p> Je voudrais transformer ce fichier de données tel que - p> 1) Les deux premières colonnes, 2) 3) 4) Idéalement, les colonnes doivent être réorganisées de plus ancienne à la plus récente (c.-à-d. Dans l'ordre suivant: 5) Calculer une colonne en utilisant dplyr, cela peut être fait manuellement en réorganisant les colonnes. Mais je cherche un moyen de construire une logique qui réorient automatiquement des colonnes pour les 3 mois les plus récents de la séquence décrite ci-dessus. En prenant les valeurs de date incorporées dans les noms de colonne et la réorganisation selon elles. P> La table résultante ressemblerait à ceci - p> _score code> colonne) et le score moyen correspondant pour tous les hôpitaux pour ce mois (
_OOver code> colonne).
Hospital Code> et
Question Code> Restez le même P>
_Score code> Colonnes de
_OOOver code> Colonne du mois le plus récent est conservé p>
mois m-2_score code>,
mois m-1_score code>,
mois m_score code>,
mois M_OOVER code>)
la variance code> à la fin, quelle est la différence entre le score M et le score M-1 P>
#Final table
df_transformed = df %>%
select(1:2,8,10,12,11) %>%
mutate(Variance=.[[5]]-.[[4]])
3 Réponses :
Je n'ai pas vraiment de questions 4 et 5, mais ils se sentent un peu comme "Pouvez-vous faire mes devoirs, s'il vous plaît?". Pour les questions 1 à 3, considérez ceci:
library(tidyverse) library(lubridate) df <- data.frame(Hospital=c(rep("Hospital A",10),rep("Hospital B",10),rep("Hospital C",10),rep("Hospital D",10)), Question=c(rep("Q1",40)), key=c(rep(c("2020-01-31_Average","2020-01-31_Score","2020-02-29_Average","2020-02-29_Score", "2020-03-31_Average","2020-03-31_Score","2020-04-30_Average","2020-04-30_Score", "2020-05-31_Average","2020-05-31_Score"),4)), value=c(round(runif(40,0,1),2))) # take the dataframe df %>% # get month as a date and key separately mutate(month = str_replace(key, "_[[:alpha:]]*$", "") %>% ymd() , key = str_extract(key, "[[:alpha:]]*$")) %>% # filter Score for the last 3 and Average for the last 1 months filter(!(today() - month > months(3) & key == "Score")) %>% filter(!(today() - month > months(1) & key == "Average"))
J'ai utilisé votre fichier Pour calculer la variance df code> dans le format long avant le
Screen code> étape.
. [ [3]] -. [[[4]] code> sera corrigé car la colonne
"hôpital" code> est corrigée et serait toujours la 1ère colonne.
"moyenne" code> passerait avant
"score" code> colonne (alphabétiquement) et puisque les données sont triées par
Date code>, nous savons que la date la plus élevée serait être placé d'abord, puis seconde le plus élevé et ainsi de suite. p> p>
Il s'agit d'une solution possible si les colonnes de votre ensemble de données sont déjà commandées chronologiquement sortie p>