1
votes

Comment agréger des lignes en une variable factorielle à trois niveaux?

J'ai un ensemble de données dans lequel certains participants ont plusieurs lignes et j'ai besoin d'agréger les données de manière à ce que chaque participant n'ait qu'une seule ligne. L'ensemble de données contient différents types de variables (par exemple, facteurs, date, âge, etc.) J'ai créé un code qui fonctionne et ressemble à ceci:

example4 <- SMARTdata_50j_diagc_2016  %>% 
  group_by( Patient_Id ) %>%  
  summarise( Groep = first( Groep ),
             Ziekenhuis_Nr = first( Ziekenhuis_Nr ),
             Ziekenhuistype = first( Ziekenhuistype ),
             aantalDBC = n(),
             aantalVervolg = sum( as.numeric( Zorgtype_Code ) ),
             Leeftijd = mean( Lft_patient_openenDBC ),
             MRI_nee_ja = max( ifelse( MRI_nee_ja == 0, 0, 1 ) ),
             aantalMRI = sum( MRI_Aantal ),
             Artroscopie_nee_ja = max( ifelse( Artroscopie_nee_jaz_jam == 0, 0, 1 ) ),
             aantalArtroscopie = sum( Artroscopie_aantal ),
             overigDBC = mean( Aantal_overigeDBC_bijopenen ),
             DBC_open = min( open_DBC ), 
             DBC_sluiten = max( sluiten_DBC ) ) %>% 
  as.data.frame()

Ce code me donne une seule ligne pour chaque participant . Cependant, j'ai une autre variable que je dois inclure dans le nouveau dataframe, mais je ne sais pas comment faire cela. La variable que je dois ajouter s'appelle 'Diagnose_Code' et est un facteur à deux niveaux, à savoir 0 (pour 1801) et 1 (pour 1805).

Pour les participants qui ont plusieurs lignes (dans la base de données d'origine), certains participants ont à la fois un 0 et un 1 pour cette variable. Maintenant, dans mon nouveau dataframe, je veux créer une variable pour 'Diagnose_Code' avec trois niveaux: 0 pour si toutes les lignes de ce participant sont 0, 1 pour si toutes les lignes de ce participant sont 1, et 2 pour si les lignes de ce participant a à la fois un 0 et un 1.

Je ne sais pas comment faire fonctionner cela. J'ai eu un peu de mal avec le code ifelse, mais sans succès. Quelqu'un sait-il comment je peux faire fonctionner cela dans mon code? Merci d'avance!


0 commentaires

3 Réponses :


3
votes

En utilisant un jeu de données de jouet, ceci peut être réalisé comme ceci:

library(dplyr)

df <- data.frame(
  id = rep(1:3, each = 3),
  diagnosis_code = c(rep(1,3), rep(0, 3), c(1, 0, 1)),
  stringsAsFactors = FALSE
)
df %>% 
  group_by(id) %>% 
  summarise(diagnosis_code = case_when(
    all(diagnosis_code == 1) ~ 1,
    all(diagnosis_code == 0) ~ 0,
    TRUE ~ 2
  ))
#> # A tibble: 3 x 2
#>      id diagnosis_code
#>   <int>          <dbl>
#> 1     1              1
#> 2     2              0
#> 3     3              2

Créé le 29/03/2020 par package reprex (v0.3.0)


2 commentaires

Mon plaisir. Si vous voulez me rendre service: marquez la question comme répondue. En plus de donner du crédit à moi ou à l'un des autres gars, cela montre aux autres avec un problème similaire que la solution a fonctionné et supprime la question de la file de questions en attente de réponse.


Merci encore, j'ai marqué la question comme réponse.



2
votes

Utiliser ifelse devrait fonctionner:

df <- data.frame(id=c(1,1,1,2,2,2,3,3,3), diag=c(1,0,0,1,1,1,0,0,0))

# A tibble: 3 x 2
     id  diag
  <dbl> <dbl>
1     1     2
2     2     1
3     3     0

Données :

df %>%
group_by(id) %>%
  summarise(diag=ifelse(max(diag)!=min(diag), 2, 
                          ifelse(max(diag==1), 1, 0)))


0 commentaires

2
votes
df %>% 
  group_by(Patient_Id) %>% 
  summarise(Diagnose_Code = case_when(n_distinct(Diagnose_Code) == 2 ~ 3, 
                                      sum(Diagnose_Code) ==  1 ~ 1, 
                                      TRUE ~ 0 ))

0 commentaires