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