Statistiques sommaires de Stata putexcel par groupe à MS Excel

J'essaie d'get le putexcel command Stata pour me donner des statistics sommaires pour une variable continue, regroupée par une variable catégorique, l'une après l'autre, dans la même feuille de travail. Cela devrait être répété / passé en boucle pendant un certain nombre d'années, où chaque année a sa propre feuille.

Cela pose deux problèmes:

  1. L'utilisation de bysort n'inscrit pas tous les groupes (bien, peut-être, mais je ne comprends pas comment les récupérer), il me semble que je dois utiliser une condition if pour chaque niveau. Par conséquent, les problèmes sont les suivants:

  2. Il existe 150 catégories (groupes) dans ma variable catégorielle, tous les nombres semi-randoms à 4 numbers. Donc, idéalement, la solution détecterait automatiquement le nombre de niveaux dans le groupe-variabel au lieu de moi d'écrire en main les 150 catégories différentes pour chaque déclaration if.

Voici un exemple de database:

 clear input /// id income1996 income1997 employcode1996 employcode1997 1 500 400 3300 5000 2 500 300 5000 5000 3 900 1050 8830 8220 4 1000 1200 8220 3300 5 600 900 5000 8220 6 200 100 8220 5000 7 700 100 3300 3300 8 1000 100 5000 5000 end 

Et voici mon très bon essai pour résoudre le problème. Je sais que les variables locales sont tout aussi efficaces que simplement l'écrire en main, mais c'était mon meilleur coup.

 forval x=1996/1997 { local y=2 local z=`y'+1 local w=`y'+2 summarize income`x' if employcode`x'==3300 putexcel A1=rnames A`z'=rscalars using "C:\Users\emilbebri\Downloads\tmp\results.xlsx", sheet(year`x') modify colwise summarize income`x' if employcode`x'==5000 putexcel A`z'=rscalars using "C:\Users\emilbebri\Downloads\tmp\results.xlsx", sheet(year`x') modify colwise summarize income`x' if employcode`x'==8220 putexcel A`w'=rscalars using "C:\Users\emilbebri\Downloads\tmp\results.xlsx", sheet(year`x') modify colwise } 

J'apprécierais beaucoup une réponse, et je serais tout à fait tendu à la main! Ce type semble être sur quelque chose de similaire , cependant, le contenu réel est trop loin et je suis en perte comme la façon dont je transférerais cette connaissance à mon problème semblable, mais différent.

Mise à jour: voici la réponse de Robertos, mais modifiée pour que la sortie devienne plus compacte, comme ceci: (la raison pour laquelle la dernière ligne n'a pas de valeur moyenne et SD est parce que datatables d'exemple n'ont qu'une seule observation dans cette catégorie)

entrez la description de l'image ici

et voici le code pour le produire.

 forvalues x = 1996/1997 { local xlsrow = 2 quietly levelsof employcode`x', local(ecodes) foreach ecode of local ecodes { // show on screen quietly display "Year `x', code `ecode'" quietly summarize income`x' if employcode`x' == `ecode' quietly display "" // save to MS Excel putexcel A`xlsrow'=("Code `ecode'") B`xlsrow'=rscalars /// A1=("discokode") B1=rnames /// using "C:\Users\emilbebri\Downloads\tmp\results11.xlsx", /// sheet(`x') modify colwise // update MS Excel row local xlsrow = `xlsrow' + 1 } } 

Dans votre code mis à jour vous manquez {} pour la boucle forvalues . En outre, vous n'utilisez pas l' local employcode_tmp , et cela semble être ce que vous searchz.

La correction des erreurs de syntaxe que je mentionne et la suppression de la seconde en quietly devrait vous donner une certaine sortie. Cependant, votre boucle donne des résultats répétés (cinq pour chaque code d'emploi). Je ne suis pas sûr que ce soit intentionnel.

Un exemple complet de travail, avec mon interprétation de ce que vous voulez, est

 clear set more off *----- example data ----- input /// id income1996 income1997 employcode1996 employcode1997 1 500 400 3300 5000 2 500 300 5000 5000 3 900 1050 8830 8220 4 1000 1200 8220 3300 5 600 900 5000 8220 6 200 100 8220 5000 7 700 100 3300 3300 8 1000 100 5000 5000 end *----- what you want ----- forvalues x = 1996/1997 { local xlsrow = 1 quietly levelsof employcode`x', local(ecodes) foreach ecode of local ecodes { // show on screen display "Year `x', code `ecode'" summarize income`x' if employcode`x' == `ecode' display "" // save to MS Excel putexcel A`xlsrow'=("Code `ecode'") A`=`xlsrow'+1'=rscalars /// using "D:/Datos/rferrer/Desktop/test.xlsx", /// sheet(`x') modify colwise // update MS Excel row local xlsrow = `xlsrow' + 3 } } 

Le résultat:

entrez la description de l'image ici

Vérifiez également l' help statsby .