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!
3 Réponses :
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)
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.
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)))
df %>% group_by(Patient_Id) %>% summarise(Diagnose_Code = case_when(n_distinct(Diagnose_Code) == 2 ~ 3, sum(Diagnose_Code) == 1 ~ 1, TRUE ~ 0 ))