conversion boucle en apply

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

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

conversion boucle en apply

Messagepar camille garcin » 15 Oct 2014, 13:06

Bonjour
J’ai fait une boucle qui fonctionne pour décrire dans un fichier txt les patients de 27 centres de dialyse suivant certaines caractéristiques (nombre de patients, age médian, etc.).

Code : Tout sélectionner

for (i in unique(tablo$n_centre_r))
{
temp<-subset(tablo,n_centre_r==i)


#variables a écrire
nom = centre$nom.centre[centre$num.centre==i]
nbRepli = dim(temp)[1]
nbPatient = length(unique(temp$patid_r))
nbHomme=length(which(temp$sexe_r==1 & !duplicated(temp$patid_r)))
nbFemme=length(which(temp$sexe_r==2 & !duplicated(temp$patid_r)))
sexRatio=round(nbHomme/nbFemme,2)
ageMed = round(median(temp$age.repli[which(!duplicated(temp$patid_r))]),1)
ageMin = min(temp$age.repli[which(!duplicated(temp$patid_r))])
ageMax = max(temp$age.repli[which(!duplicated(temp$patid_r))])
nbPrimorepli = sum(temp$primoRepli)
nbListeGreffe = sum(temp$inscriG[which(!duplicated(temp$patid_r))])
toListeGreffe = round(nbListeGreffe/nbPatient*100,1)
nbDeces = sum(!is.na(temp$date.du.deces[which(!duplicated(temp$patid_r))]))
causeDeces = paste(sort(temp$cause.principale.du.deces[which(!duplicated(temp$patid_r) & !is.na(temp$cause.principale.du.deces))]),collapse=', ')

cat(
'Centre : ',nom,'\n',
'Nombre de repli(s) : ',nbRepli,'\n',
'Nombre de patient(s) : ',nbPatient,'\n',
'Age médian : ',ageMed,' ans ([',ageMin,'-',ageMax,'])','\n',
'Genre : ',nbHomme,' homme(s) et ',nbFemme,' femme(s), Sex ratio : ',sexRatio,'\n',
'Nombre de premier(s) repli(s) : ',nbPrimorepli,'\n',
'Nombre d\'inscrit(s) sur liste de greffe : ',nbListeGreffe,' (',toListeGreffe,' % des patients)','\n',
'Nombre de décès : ',nbDeces,'\n',
'Causes des décès (CIM 10) :  ',causeDeces,'\n','\n','\n',
file='bilan-centres-repli.txt',sep='',append=T)

}

J’aimerais savoir quels serait l’équivalent de cette boucle avec un apply.
Cordialement,
CG

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Messagepar Gabriel Terraz » 15 Oct 2014, 15:03

Salut ,

Code : Tout sélectionner

apply(tablo , 1 , grosseunsineàgazsansaspirine)


Plus sérieusement, dis nous peut-être ce que tu veux faire, montre à quoi ressemblent tes données, et ce que tu veux obtenir.
Peut-être que c'est inutile de mettre toutes tes descriptions pour le moment.

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

Messagepar camille garcin » 15 Oct 2014, 15:46

Merci pour ce 1er élément qui dégrossit singulièrement mon problème. ;)
Pour être plus précis, j’ai un tableau de données décrivant des patients dans 27 centres de dialyse.

Code : Tout sélectionner

> str(tablo)
'data.frame':   1847 obs. of  41 variables:
 $ patid_r                  : Factor w/ 3501 levels "0","11335","11653",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ n_repli                  : num  6040 6041 6042 6453 5964 ...
 $ n_centre_r               : Factor w/ 38 levels "107501","107502",..: 3 3 3 5 4 35 3 4 22 3 ...
 $ nompatr_r                : chr  "HARRISON" "LENNON" "STARR" "MCCARTNEY" ...
 $ prenom_r                 : chr  "GEORGE" "JOHN" "RINGO" "PAUL" ...
 $ nommarit_r               : chr  NA NA NA NA ...
 $ sexe_r                   : Factor w/ 2 levels "1","2": 1 2 2 1 2 2 1 1 2 2 ...
 $ datnais_r                : Date, format: "1952-06-30" "1944-07-15" ...
 $ datdcd_r                 : Date, format: NA NA ...
 $ patdcd_r                 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ datePD_r                 : Date, format: "2012-11-08" "2012-11-14" ...
 $ dateDD_r                 : Date, format: "2013-01-06" "2013-01-12" ...
 $ hospit_r                 : Factor w/ 3 levels "0","1","2": 2 2 2 2 2 1 2 2 2 3 ...
 $ n_centre_origin          : Factor w/ 381 levels "029B01","029B03",..: 13 13 47 32 44 172 37 170 37 304 ...
 $ nature_r                 : int  1 1 1 1 1 1 1 1 1 1 ...
 $ nature_lbl_r             : Factor w/ 1 level "Repli": 1 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_affC                : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_affV                : Factor w/ 2 levels "0","1": 2 1 2 1 1 1 2 1 1 1 ...
 $ cs_r_FAV                 : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_KTDP                : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_KTHD                : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_infect_loc          : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_infect_syst         : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_hospit_chir         : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
 $ cs_r_programme           : Factor w/ 4 levels "0","1","2","3": 3 3 2 2 2 2 2 2 2 2 ...
 $ cs_r_hospit_ssr          : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 2 1 1 1 ...
 $ cs_r_hospit_autr         : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ cs_r_sociale             : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 2 ...
 $ cs_r_autre               : Factor w/ 2 levels "0","1": 2 2 1 1 2 1 2 1 2 2 ...
 $ cs_r_autreTxt            : chr  "INSUFFISANCE CARDIAQUE MAJEURE CIRRHOSE" "ENCEPHALOPATHIE" NA NA ...
 $ n_centre_destination     : Factor w/ 359 levels "______","_____D",..: 17 17 53 37 46 175 17 185 125 291 ...
 $ etat_dossier_r           : int  2 2 2 2 2 2 2 2 2 2 ...
 $ matchDossierSIMSRein     : int  5 5 5 5 5 5 5 5 5 5 ...
 $ methoDial_r              : Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
 $ primoRepli               : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ dateInscri               : Date, format: NA NA ...
 $ inscriG                  : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ cause.principale.du.deces: Factor w/ 732 levels "","A021","A041",..: NA NA NA NA NA NA NA NA NA NA ...
 $ date.du.deces            : Date, format: NA NA ...
 $ age.repli                : num  60.4 68.3 68.4 79.8 50.5 57.1 51.6 81.3 27 80.6 ...
 $ Age.repli                : Factor w/ 7 levels "[0-20)","[20-40)",..: 4 4 4 5 3 3 3 6 2 6 ...

J’aimerais décrire chaque centre sur le même motif :
-------------------
Centre : ……
Nombre de repli(s) : …..
Nombre de patient(s) : …
Age médian : … ans
Genre : … homme(s) et … femme(s), Sex ratio : ….
Nombre d'inscrit(s) sur liste de greffe : ….
Nombre de décès : ….
--------------------
et récupérer le tout dans un même fichier txt pour avoir une vision globale de cet ensemble de centres.
La boucle ci-dessus donne ce que je veux mais je voulais savoir comment obtenir la même chose avec un apply. Je pensais à un tapply à appliquer sur le facteur num.centre de mes données. Mais j'ai du mal à voir comment structurer la fonction dans le apply...
J'espère avoir été plus clair.
CG

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 15 Oct 2014, 19:43

bonsoir,

Je t'invite fortement à regarder le package plyr et notamment la fonction summarize qui fera le travail de ta boucle avec un joli petit bout de code bien aéré et d'une totale transparence pour ceux qui ne l'ont pas écrit :)

exemple:

Code : Tout sélectionner

require(plyr)
ddply(tablo,.(num.centre),function(tab) {summarize(tab,
   nom=unique(nom.centre)
   nbRepli = nrow(tab)
   nbPatient = length(unique(patid_r))
   )})

à toi de ddéfinir ensuite chaque colonne selon les calculs qui conviennent

Nicolas


Retourner vers « Questions en cours »

Qui est en ligne

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