Fonction aggregate

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Anais Payen
Messages : 54
Enregistré le : 25 Fév 2019, 08:50

Fonction aggregate

Messagepar Anais Payen » 25 Fév 2019, 13:49

Bonjour à tous,

Nouvelle utilisatrice de R, je me forme petit à petit sur un data.frame et je rencontre actuellement quelques problèmes.

En effet, j'ai un data.frame avec plusieurs lignes pour un même patient qui me donne un ou plusieurs numéros Finess (numéro associé à un établissement de santé)

Code : Tout sélectionner

  person_id       n_finess
1         2        590782215
2         3        590782165
3         3        590782215
4         3         non defini


Je souhaiterai, tout d'abord, savoir combien de numéro finess différent j'ai pour un seul et même patient.

Ensuite concatener mes numéros finess par patient pour n'obtenir plus qu'une seule ligne.

Je sais que mon numéro d'identifiant patient est la key mais après avoir essayé plusieurs formules je n'obtiens toujours pas ce que je cherche.

Il arrive que pour certains établissements j'ai un numéro finess qui soit indiqué comme '"non défini" dans mon data.frame.

Lorsque je teste cette fonction, elle me donne le nombre de numéro finess différent pour tout mon tableau.

Code : Tout sélectionner

> sapply(paerpa_110, function(x) sum(!duplicated(x)))
                     X              person_id    visit_occurrence_id       n_finess
                    20                      9                     20                      4 
               



Par avance, je vous remercie pour votre aide!

Pierre-Yves Berrard
Messages : 697
Enregistré le : 12 Jan 2016, 23:30

Re: Fonction aggregate

Messagepar Pierre-Yves Berrard » 25 Fév 2019, 16:07

Bonjour,

Code : Tout sélectionner

donnees <- data.frame(
  person_id = c("2", "3", "3", "3"),
  n_finess = c("590782215", "590782165", "590782215", "non defini"),
  stringsAsFactors = FALSE
)

S'il n'y avait qu'à répondre à la première question, on pourrait faire ceci :

Code : Tout sélectionner

tapply(donnees$n_finess, donnees$person_id, length)
NB : si un même patient peut avoir plusieurs lignes avec le même finess, il faut utiliser unique(length(...))

Mais vu que vous souhaitez quelque chose de plus élaboré, autant utiliser directement le package dplyr qui peut faire le tout en une fois :

Code : Tout sélectionner

library(dplyr)

base_person_id <-
  donnees %>%
  group_by(person_id) %>%
  summarise(
    n_finess_nb = n_distinct(n_finess),
    n_finess_str = paste(n_finess, collapse = ","),
    n_finess_vect = list(n_finess)
  )

J'ai proposé deux façons de rassembler les finess : sous forme de chaînes et sous forme de vecteur. À vous de voir !

Quant à la dernière remarque avec sapply, le résultat ne correspond manifestement pas aux données présentées plus haut, donc difficile de dire quel est le problème.
PY

Anais Payen
Messages : 54
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction aggregate

Messagepar Anais Payen » 25 Fév 2019, 16:31

Bonjour Pierre-Yves Berrard,

Merci pour votre réponse!

Les fonctions:
n_finess_nb = n_distinct(n_finess),
n_finess_str = paste(n_finess, collapse = ","),

correspondent exactement à ce que je souhaitais faire! =)

Je souhaitais les avoir sous forme de chaines, et j'avoue ne pas bien saisir le principe de vecteur.

Je vous remercie encore.

Bonne journée

Anais Payen
Messages : 54
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction aggregate

Messagepar Anais Payen » 25 Fév 2019, 16:46

Une deuxième question :

Si le numéro finess d'intérêt est le "590782165", est il possible d'ajouter une colonne supplémentaire à mon data.frame où je pourrais attribuer un score de 0/1 pour permettre d'identifier plus rapidement les patients qui sont passés par cet établissement?

Mon data.frame contient 114500 lignes, il est difficile de naviguer dessus.

Merci d'avance

Pierre-Yves Berrard
Messages : 697
Enregistré le : 12 Jan 2016, 23:30

Re: Fonction aggregate

Messagepar Pierre-Yves Berrard » 25 Fév 2019, 17:37

Ajouter pour cela une ligne dans summarise() du style :

Code : Tout sélectionner

indic_590782165 = "590782165" %in% n_finess
PY

François Bonnot
Messages : 484
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction aggregate

Messagepar François Bonnot » 26 Fév 2019, 08:06

Bonjour,
Avec aggregate :

Code : Tout sélectionner

aggregate(donnees["n_finess"], donnees["person_id"], length)
aggregate(donnees["n_finess"], donnees["person_id"], function(x) x)
François

Anais Payen
Messages : 54
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction aggregate

Messagepar Anais Payen » 26 Fév 2019, 08:54

Bonjour,

Pierre-Yves Berrard a écrit :Ajouter pour cela une ligne dans summarise() du style :

Code : Tout sélectionner

indic_590782165 = "590782165" %in% n_finess


Effectivement cette réponse correspond parfaitement à ce que j'espérais, merci beaucoup!

François Bonnot a écrit :Bonjour,
Avec aggregate :

Code : Tout sélectionner

aggregate(donnees["n_finess"], donnees["person_id"], length)


Je pensais que la fonction aggregate serait la réponse, mais avec cette formule, la réponse n'est pas toute à fait complète, car en effet pour le patient 3, il présente 3 séjours avec le même numéro finess et la fonction me donne 3 comme résultat, or il n'y a qu'un seul établissement concerné!


Code : Tout sélectionner

  person_id                    n_finess
1         2                      1
2         3                      3
3         4                      4

François Bonnot
Messages : 484
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction aggregate

Messagepar François Bonnot » 26 Fév 2019, 09:36

pour le patient 3, il présente 3 séjours avec le même numéro finess et la fonction me donne 3 comme résultat, or il n'y a qu'un seul établissement concerné

Dans l'exemple donné dans l'énoncé de la question il n'y a pas qu'un seul établissement pour le patient 3 mais bien 3 (si on considère "non défini" comme un établissement) ou 2 (dans le cas contraire).
Donc en supposant que la base contienne effectivement des établissement identiques:

Code : Tout sélectionner

aggregate(donnees["n_finess"], donnees["person_id"], function(x) length(unique(x)))
aggregate(donnees["n_finess"], donnees["person_id"], function(x) unique(x))
François

Anais Payen
Messages : 54
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction aggregate

Messagepar Anais Payen » 26 Fév 2019, 10:12

Bonjour,

Effectivement c'est une erreur de ma part, n'ayant pas réussi à insérer correctement ma base de données, je l'ai modifié pour vous montrer tous les cas de figures possibles.

Non défini correspond bien à un établissement.

François Bonnot a écrit :

Code : Tout sélectionner

aggregate(donnees["n_finess"], donnees["person_id"], function(x) length(unique(x)))
aggregate(donnees["n_finess"], donnees["person_id"], function(x) unique(x))


Si je mets donnees$n_finess à la place du x, R affiche ceci :

Code : Tout sélectionner

Error in match.fun(FUN) :
  'length(unique(donnes$n_finess))' is not a function, character or symbol


Pourtant c'est de cette façon que je code mon length(unique) d'habitude.

Pourriez vous m'éclairer?

François Bonnot
Messages : 484
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction aggregate

Messagepar François Bonnot » 26 Fév 2019, 10:28

Si je mets donnees$n_finess à la place du x, R affiche ceci (...) Pourriez vous m'éclairer?

Oui : il suffit de ne pas mettre donnees$n_finess à la place du x.
François

Anais Payen
Messages : 54
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction aggregate

Messagepar Anais Payen » 26 Fév 2019, 10:32

François Bonnot a écrit :
Si je mets donnees$n_finess à la place du x, R affiche ceci (...) Pourriez vous m'éclairer?

Oui : il suffit de ne pas mettre donnees$n_finess à la place du x.


Si je ne remplace pas x, voilà ce qu'il m'indique :

Code : Tout sélectionner

Error in unique(x) : objet 'x' introuvable

Pierre-Yves Berrard
Messages : 697
Enregistré le : 12 Jan 2016, 23:30

Re: Fonction aggregate

Messagepar Pierre-Yves Berrard » 26 Fév 2019, 10:50

L'argument 'FUN' de aggregate est une fonction qui va effectuer un calcul pour chaque groupe défini dans l'argument 'by'.

Dans

Code : Tout sélectionner

function(x) length(unique(x))
x est une variable muette c'est-à-dire on aurait pu choisir n'importe quel nom (pas encore utilisé dans votre programme) à la place.

Cette fonction va être appelée une fois par groupe. Par exemple au premier appel x vaudra :

Code : Tout sélectionner

donnees$n_finess[donnees$person_id == "2"]
ensuite

Code : Tout sélectionner

donnees$n_finess[donnees$person_id == "3"]
etc.
PY

François Bonnot
Messages : 484
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction aggregate

Messagepar François Bonnot » 26 Fév 2019, 11:19

Pour compléter la réponse de Pierre-Yves (et la mienne), si le nom de la base est "base" (au lieu de "donnees"), la syntaxe est

Code : Tout sélectionner

aggregate(base["n_finess"], base["person_id"], function(x) length(unique(x)))
François

Anais Payen
Messages : 54
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction aggregate

Messagepar Anais Payen » 26 Fév 2019, 13:43

François Bonnot a écrit :Pour compléter la réponse de Pierre-Yves (et la mienne), si le nom de la base est "base" (au lieu de "donnees"), la syntaxe est

Code : Tout sélectionner

aggregate(base["n_finess"], base["person_id"], function(x) length(unique(x)))


Je ne sais pas pourquoi mais il semblerait que j'avais mal codé la 1ere fois, en copiant de nouveau votre formule : tout fonctionne! Je vous remercie.

Peut-être pourriez vous m'aider à simplifier ce script, je souhaite faire un data.frame :

Code : Tout sélectionner

CHD_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title)) #tableau de 4 lignes, 6 colonnes
CHV_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title))
CHa_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title))
CHDCHV_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title))
CHDCHa_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title))
CHVCHa_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title))
all_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title))


Voici le type de data.frame que j'obtiens pour une de mes fonctions :

Code : Tout sélectionner

> CHD_table
   patients_total patients_restants patients_exclus interventions_total interventions_restantes interventions_exclues
3              NA                NA              NA                  NA                      NA                    NA
6              NA                NA              NA                  NA                      NA                    NA
9              NA                NA              NA                  NA                      NA                    NA
12             NA                NA              NA                  NA                      NA                    NA


Ne serait-il pas possible de coder le data.frame en une seule ligne avec le nom des matrices sur la gauche (devant les chiffres 3/6/9/12)?

François Bonnot
Messages : 484
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction aggregate

Messagepar François Bonnot » 27 Fév 2019, 07:21

Bonjour,
Votre code n'est pas reproductible :

Code : Tout sélectionner

> CHD_table <- matrix(nrow = 4, ncol = 6, dimnames = list(hop_row_title, hop_col_title))
Error : object 'hop_row_title' not found

Voir :
http://forums.cirad.fr/logiciel-R/viewtopic.php?f=1&t=7638
François


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité