0
votes

R Réarriver les colonnes dans DataFrame en fonction des valeurs de date dans les noms de colonne

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 ( _score code> colonne) et le score moyen correspondant pour tous les hôpitaux pour ce mois ( _OOver code> colonne).

Voici un échantillon court de ce qu'il ressemble - p> xxx pré>

Je voudrais transformer ce fichier de données tel que - p>

1) Les deux premières colonnes, Hospital Code> et Question Code> Restez le même P>

2) _Score code> Colonnes de trois mois les plus récents forts> seulement sont uniquement conservé p>

3) _OOOver code> Colonne du mois le plus récent est conservé p>

4) Idéalement, les colonnes doivent être réorganisées de plus ancienne à la plus récente (c.-à-d. Dans l'ordre suivant: mois m-2_score code>, mois m-1_score code>, mois m_score code>, mois M_OOVER code>)

5) Calculer une colonne la variance code> à la fin, quelle est la différence entre le score M et le score M-1 P>

Qu'est-ce que j'essaie atteindre strong> p>

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>

#Final table
df_transformed = df %>%
  select(1:2,8,10,12,11) %>%
  mutate(Variance=.[[5]]-.[[4]])


0 commentaires

3 Réponses :


0
votes

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"))


0 commentaires

0
votes

J'ai utilisé votre fichier df dans le format long avant le Screen étape. xxx

Pour calculer la variance . [ [3]] -. [[[4]] sera corrigé car la colonne "hôpital" est corrigée et serait toujours la 1ère colonne. "moyenne" passerait avant "score" colonne (alphabétiquement) et puisque les données sont triées par Date , nous savons que la date la plus élevée serait être placé d'abord, puis seconde le plus élevé et ainsi de suite.


0 commentaires

1
votes

Il s'agit d'une solution possible si les colonnes de votre ensemble de données sont déjà commandées chronologiquement xxx

sortie xxx


0 commentaires