Comment renommer plusieurs variables avec de la ficelle de suffixes
Dans Stata, j'ai un ensemble de variables qui commencent toutes par pkg
. Dans leur état actuel, leurs terminaisons sont les numériques: pkg1
, pkg2
, pkg3
, pkg4
et ainsi de suite.
J'ai besoin de changer l'ensemble de ces variables' terminaisons des chaînes: pkgmz
, pkggmz
, pkgsp
, pkgsptc
etc.
J'ai une colonne de la chaîne de ces terminaisons, qui je peut désigner comme une liste locale.
Par exemple:
local croplist mz gmz sp sptc mil cof suk tea ric
Comment puis-je changer le numérique terminaisons de la chaîne de terminaisons?
Ma deviner le code peut être trouvé ci-dessous et le ???
indiquer où je suis perplexe:
local croplist crops mz gmz sp sptc mil cof suk tea ric
foreach x of varlist pkg* {
local new1 = substr(`x', 1, 3)
local new2 = ???
rename `x' ``new1'`new2''
label var ``new1'`new2'' "Avg district level `new2' price"
}
Je me demande si il serait mieux d'utiliser le regexr()
de commande, mais ne peut pas penser à un moyen de l'inclure.
Toute aide est appréciée.
OriginalL'auteur ben | 2012-12-03
Vous devez vous connecter pour publier un commentaire.
Il n'est pas nécessaire ici d'invoquer des expressions régulières. Vous avez le nouveau suffixes; le préfixe
pkg
est toujours la même, de sorte que le travail de l'extraction de il a, à plusieurs reprises inutiles. Le cœur du problème est le vélo sur deux listes à la fois. Voici un moyen de corriger votre code.Note également
rename
dans Stata 12+ peut gérer cela;regexr()
est une fonction, pas une commande; une discussion plus générale dans http://www.stata-journal.com/sjpdf.html?articlenum=pr0009 (un peu out-of-date, mais pertinent sur la question principale); vous avez trop de guillemets sur votrerename
de commande, de sorte qu'il ne fonctionne pas.MODIFIER le 30 juillet 2018
J'ai tendance maintenant le plus souvent à l'utilisation
gettoken
:Le local macro
croplist
est une pile. Chaque fois autour de la boucle de nous tenir le haut de l'élément de la pile et de laisser le reste pour la prochaine fois.Chaque fois autour de la boucle
Cox Vous avez mentionné que le
rename
commande Stata 12+ peut gérer cela. Est-il possible de le faire en une seulerename
commande? J'ai posté une réponse avec quelques options à l'aide de la commande nouveau, mais je n'arrivais pas à savoir si il était possible d'utiliser un seul appel.Un Il est possible de le faire avec une seule commande, mais la seule réponse qui me vient à l'esprit est de ne pas s'engager.
rename (pkg1-pkg9 ) (pkgmz pkggmz pkgsp pkgsptc pkgmil pkgcof pkgsuk pkgtea pkgric)
Encore, il reste vrai que les gens vont passer des minutes à essayer de trouver une astuce lorsque les noms pourraient avoir été saisis en quelques secondes.OriginalL'auteur Nick Cox
Ici est une autre façon de faire.
tokenize
met séparer les mots dans les macros, numérotés de 1. La référence imbriquée``j''
est traités élémentaires de l'algèbre: évaluer l'intérieur de la macro de référence première.Ce serait une bonne chose quand les nombres sont consécutifs. Il s'avère que dans mon cas, les chiffres ne sont pas consécutifs (bien que je pensais qu'ils étaient lors de posté ma question). Alors je vais donner le chèque à Nick de la première réponse. Mais les deux sont très utiles.
OriginalL'auteur Nick Cox
Ben demandé dans un commentaire sur l'incrémentation des compteurs lieu dans des macros.
Stata local de macros sont en général pour la tenue des chaînes, chaîne de
les personnages peuvent être numériques, de sorte que la tenue de nombres est un cas spécial, mais
naturellement très utile. Ce fil, seul, a montré à plusieurs
des exemples. Il aide à se tenir que l'histoire dans l'esprit. Longue date de la syntaxe
est basée sur les formulaires
et
La première forme de copies à
macname
tandis que la deuxième formeévalue avant d'affecter les résultats de
macname
. L'le principal moyen d'incrémenter les compteurs a été pendant plusieurs versions
mais la syntaxe
est maintenant autorisé. Cependant, bien que permis
ne fonctionne pas comme vous l'attendez, bien que ce qui se produit est compatible avec
la première syntaxe pour les macros.
Donc, si cela semble un peu étrange compte tenu de votre expérience, c'est
compréhensible, mais les macros ont été destinés au traitement de chaîne,
pas arithmétique. Mata est beaucoup plus grand public, comme à cet égard.
J'ai écrit un tutoriel sur les boucles et les macros dans
Cox, N. J. 2002. Comment faire face à des listes avec force. Stata Journal 2(2):
202-222
qui est accessible à tous à
http://www.stata-journal.com/sjpdf.html?articlenum=pr0005
OriginalL'auteur Nick Cox
De Stata 12+,
rename
peut gérer ce cas de plusieurs façons.Cette méthode permet de créer une nouvelle macro
new_croplist
contenant les noms de variablespkgmz pkggmz pkgsp pkgsptc pkgmil pkgcof pkgsuk pkgtea pkgric
, puis utiliserename
pour renommer les variables suivant le modèlepkg<digits>
pour les noms spécifiés dansnew_croplist
. Les chiffres qui suiventpkg
n'ont pas besoin d'être consécutives.Une deuxième méthode utilise la nouvelle
rename
fonction deux fois; comme avant, cela ne nécessite pas de numéros consécutifs dans les noms d'origine. La première commande renomme les variables du modèlepkg<digits>
pour les noms spécifiés danscroplist
. La deuxième commande ajoute le préfixepkg
pour les nouveaux noms de variables.Dans les deux cas, et en général lors de l'utilisation de la
rename
de commande (dénommérename group
dans Stata de la documentation), le nombre d'anciens noms de variable doit correspondre au nombre de nouveaux noms de variables, alors assurez-vous que le nombre de variables appariées parpkg#
correspond au nombre de nouveaux noms spécifiés dans `croplist'.OriginalL'auteur Michael A
Une alternative à l'utilisation d'un compteur comme dans @Nick est un excellent exemple, consiste à employer
macro shift
:Vous pouvez également utiliser le
ds
commande pour obtenir une liste de noms de variables commençant parpkg
:Dans les deux cas, vous bénéficiez de:
OriginalL'auteur Pearly Spencer