1
votes

R tidyverse, remodeler les données à une ligne par sujet, mais plusieurs colonnes sont affectées

J'ai un exemple de bloc de données comme celui-ci:

sample2<-structure(list(`Full Name` = c("Smith, Jane", NA, NA, NA, 
                           NA, NA, "Doe, John", NA, NA, NA), `Age 
           (Y)` = c("24", 
                    NA, NA, NA, NA, NA, "22", NA, NA, NA), Gender = c("F", NA, NA, 
                                                                      NA, NA, NA, "M", NA, NA, NA), `Procedure Performed 
           (ICD9 Code)` = c("34.04 INSERTION OF INTERCOSTAL CATHETER FOR DRAINAGE", 
                            "86.59 CLOSURE OF SKIN AND SUBCUTANEOUS TISSUE OTHER SITES", 
                            "87.03 COMPUTERIZED AXIAL TOMOGRAPHY OF HEAD", "88.01 COMPUTERIZED AXIAL TOMOGRAPHY OF ABDOMEN", 
                            "87.41 COMPUTERIZED AXIAL TOMOGRAPHY OF THORAX", NA, "96.04 INSERTION OF ENDOTRACHEAL TUBE", 
                            "57.94 INSERTION OF INDWELLING URINARY CATHETER", "99.29 INJECTION OR INFUSION OF OTHER THERAPEUTIC OR PROPHYLACTIC SUBSTANCE", 
                            "38.02 INCISION OF OTHER VESSELS OF HEAD AND NECK"), `Interventions RH` = c("xray", 
                                                                                                        "CT Head", NA, NA, NA, NA, "CT Chest - Referring Hospital", "Chest Tube Placement", "Ct Head", 
                                                                                                        NA)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
                                                                                                        ))

Comme vous pouvez le voir, il y a beaucoup de lignes pour la plupart vides. Toutes les lignes pour la plupart vides sous le nom d'un sujet sont associées à ce sujet. J'aimerais remodeler mon ensemble de données pour qu'il comporte une ligne par sujet, et j'ai besoin d'aide.

J'ai regardé d'autres réponses ici à ce sujet, et j'ai demandé à mes amis à ce sujet , et je continue à voir la réponse "rassemblez-le puis diffusez-le", mais cette situation particulière me met au défi pour plusieurs raisons spécifiques:

  1. Les lignes sont vides dans la colonne "nom complet" que je saisis habituellement. C'est à dire. Je ne peux pas dire à R de rassembler toutes les lignes de Jane Smith, car elles ne contiennent pas son nom.
  2. Je souhaite étaler plusieurs colonnes. Je souhaite créer plusieurs colonnes à partir de la colonne "procédure effectuée", c'est-à-dire procédure1, procédure2, etc. et je souhaite créer plusieurs colonnes à partir de la colonne "Interventions Rih".
  3. Je vais probablement finir par rechercher dans les données des mots ou des phrases particuliers pendant l'analyse, donc s'il est plus facile de coder chaque procédure pour un patient particulier dans la colonne "procédure effectuée" pour ce patient ( dans une rangée), je suis d'accord avec ça aussi.

Donc, pour la sortie attendue, je suis d'accord avec: entrez la description de l'image ici

ou: entrez la description de l'image ici

Merci pour votre aide!


1 commentaires

Veuillez montrer votre résultat attendu


3 Réponses :


2
votes

Vous pouvez le faire dans un format beaucoup plus simple en utilisant d'abord la fonction fill () qui remplit les valeurs nulles avec les données précédentes, puis vous groupez vos données et les résumez en les collant / concaténant.

library(dplyr)
library(tidyr)

sample2<-
  structure(list(
    `Full Name` = c("Smith, Jane", NA, NA, NA, NA, NA, "Doe, John", NA, NA, NA), 
    `Age (Y)` = c("24", NA, NA, NA, NA, NA, "22", NA, NA, NA), 
    Gender = c("F", NA, NA, NA, NA, NA, "M", NA, NA, NA), 
    `Procedure Performed (ICD9 Code)` = 
      c("34.04 INSERTION OF INTERCOSTAL CATHETER FOR DRAINAGE",
        "86.59 CLOSURE OF SKIN AND SUBCUTANEOUS TISSUE OTHER SITES", 
        "87.03 COMPUTERIZED AXIAL TOMOGRAPHY OF HEAD", 
        "88.01 COMPUTERIZED AXIAL TOMOGRAPHY OF ABDOMEN", 
        "87.41 COMPUTERIZED AXIAL TOMOGRAPHY OF THORAX", 
        NA, 
        "96.04 INSERTION OF ENDOTRACHEAL TUBE",
        "57.94 INSERTION OF INDWELLING URINARY CATHETER", 
        "99.29 INJECTION OR INFUSION OF OTHER THERAPEUTIC OR PROPHYLACTIC SUBSTANCE", 
        "38.02 INCISION OF OTHER VESSELS OF HEAD AND NECK"), 
    `Interventions RH` = c("xray", "CT Head", NA, NA, NA, NA, 
                           "CT Chest - Referring Hospital", "Chest Tube Placement", 
                           "Ct Head", NA)), 
    row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

new_sample <-
  sample2 %>%
  fill("Full Name") %>%
  fill("Age (Y)") %>%
  fill("Gender") %>%
  mutate(`Procedure Performed (ICD9 Code)` = replace_na(`Procedure Performed (ICD9 Code)`, ""),
         `Interventions RH` = replace_na(`Interventions RH`, "")) %>%
  group_by(`Full Name`, `Age (Y)`, `Gender`) %>%
  summarise(`Procedure Performed (ICD9 Code)` = 
              paste(`Procedure Performed (ICD9 Code)`, collapse =" "),
            `Interventions RH` = 
              paste(`Interventions RH`, collapse = " "))


0 commentaires

3
votes

Vous pouvez également le faire en utilisant data.table pour l'agrégation et zoo pour remplir les valeurs NA . J'ai changé les noms de vos colonnes pour rendre le code plus lisible.

library(data.table)
library(zoo)
setDT(sample2)
names(sample2) <- c("Name", "Age", "Gender", "Procedure", "Interventions")
sample2[, Name := na.locf(Name)] 


newSample = sample2[,.(
  Age = first(Age),
  Gender = first(Gender),
  aggProcedure = paste(Procedure[!is.na(Procedure)],collapse=","),
  aggInterventions = paste(Interventions[!is.na(Interventions)],collapse=",")), 

  by= Name]


0 commentaires

1
votes

Cela peut être facilement résolu avec les dernières mises à jour de tidyr v1.0.0 .

Je vais également renommer vos colonnes pour qu'elles soient un peu plus faciles à utiliser: p>

> sample_pivot_df
# A tibble: 2 x 15
  full_name age   gender procedure_1 procedure_2 procedure_3 procedure_4 procedure_5 procedure_6
  <chr>     <chr> <chr>  <chr>       <chr>       <chr>       <chr>       <chr>       <chr>      
1 Smith, J… 24    F      34.04 INSE… 86.59 CLOS… 87.03 COMP… 88.01 COMP… 87.41 COMP… NA         
2 Doe, John 22    M      96.04 INSE… 57.94 INSE… 99.29 INJE… 38.02 INCI… NA          NA         
# … with 6 more variables: intervention_1 <chr>, intervention_2 <chr>, intervention_3 <chr>,
#   intervention_4 <chr>, intervention_5 <chr>, intervention_6 <chr>

Ce qui nous donne ce qui suit:

library(tidyr)
library(dplyr)

sample_pivot_df <- sample2 %>% 
  # First renaming cols, but you can choose not to do this
  rename(full_name = `Full Name`,
         age = `Age 
                        (Y)`,
         gender = Gender,
         procedure = `Procedure Performed 
                        (ICD9 Code)`,
         intervention = `Interventions RH`) %>% 
  # Fill for repeated entries
  fill(full_name, age, gender) %>% 
  # Add a dummy column for number of procedures
  group_by(full_name) %>% 
  mutate(procedure_count = row_number()) %>% 
  ungroup() %>% 
  # pivot the data wider for `procedure` and `intervention`
  pivot_wider(names_from = procedure_count,
              values_from = c(procedure, intervention)) 

La mise en garde ici est que l'utilisation de tidyr :: fill code > peut vous donner des résultats inattendus si des patients ont un NA pour age ou gender.


7 commentaires

absolument besoin de renommer, les noms de colonnes que je traite me donnent toutes sortes d'autres problèmes. Cette solution est parfaite, merci.


Dans ce cas, je vous recommande de consulter le package janitor , en particulier janitor :: clean_names . C'était une bouée de sauvetage pour le traitement des données de santé :)


Je viens de remarquer un léger problème. Il divise absolument les colonnes de procédure et d'intervention en plusieurs colonnes comme prévu, et en remplissant la colonne de nom, je sais quelle procédure est associée à qui, mais cela ne m'a pas laissé une ligne par sujet. J'ai plutôt autant de lignes que cette personne avait de procédures. Existe-t-il un moyen de les «effondrer»? c'est-à-dire si une ligne a un blanc pour procedure2 mais que la ligne suivante a quelque chose ... C'est logique?


Hmm, il semble que (1) l'une de vos colonnes n'a pas été renommée correctement, ou (2) vous avez des colonnes supplémentaires associées à des procédures / interventions. (1) L'utilisation des deux colonnes dans l'argument values_from devrait les réduire. Assurez-vous que ces noms sont corrects. (2) SI vous avez des colonnes supplémentaires associées à des procédures / interventions, vous devrez les supprimer ou les inclure également dans l'appel values_from


Je suis sûr à 99% que tout a été renommé correctement. Qu'entendez-vous par colonnes supplémentaires associées aux procédures / interventions? Désolé, je suis dense, pouvez-vous me donner un exemple? Et pourquoi cela poserait-il des problèmes?


Pas de soucis! Rencontrez-vous ce problème avec les données sample2 fournies? Si vous utilisez un ensemble de données différent avec des colonnes supplémentaires, vous rencontrerez probablement le problème que vous décrivez.


Continuons cette discussion dans le chat .