6

Stataには、すべてがで始まる一連の変数がありますpkg。現在の状態では、末尾は数値です:pkg1、、、pkg2など。 pkg3pkg4

これらの変数の末尾をすべて文字列に変更する必要があります:pkgmz、、、pkggmzなど。pkgsppkgsptc

これらの文字列の末尾の列があり、ローカルリストとして指定できます。

例えば:

local croplist mz gmz sp sptc mil cof suk tea ric

数字の末尾を文字列の末尾に変更するにはどうすればよいですか?

コードでの私の推測は以下にあり、???私が困惑している場所を示しています:

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"
}

コマンドを利用したほうがいいregexr()のではないかと思いますが、それを含める方法は考えられません。

どんな助けでも大歓迎です。

4

5 に答える 5

10

これを行う別の方法があります。tokenize1までの番号が付けられたマクロに個別の単語を配置します。ネストされた参照``j''は、初等代数で処理されます。最初に内部マクロ参照を評価します。

 
tokenize "mz gmz sp sptc mil cof suk tea ric" 
forval j = 1/9 {
    rename pkg`j' pkg``j''
    label var pkg``j'' "Avg district level ``j'' price"
}
于 2012-12-03T08:01:59.123 に答える
9

ここでは、正規表現を呼び出す必要はありません。新しいサフィックスがあります。プレフィックスpkgは常に同じであるため、プレフィックスを繰り返し抽出する手間は不要です。問題の核心は、一度に2つのリストを循環することです。コードを修正する1つの方法は次のとおりです。


local croplist mz gmz sp sptc mil cof suk tea ric
local j = 1 
foreach x of varlist pkg* {
    local sffx : word `j' of `croplist' 
    rename `x' pkg`sffx'
    label var pkg`sffx' "Avg district level `sffx' price"
    local ++j 
}

renameStata12+でもこれを処理できることに注意してください。regexr()コマンドではなく関数です。http://www.stata-journal.com/sjpdf.html?articlenum=pr0009でのより一般的な議論(少し古くなっていますが、主要な問題に関連しています); コマンドに引用符が多すぎるrenameため、機能しません。

2018年7月30日編集

私は今より頻繁に使用する傾向がありますgettoken

local croplist mz gmz sp sptc mil cof suk tea ric
foreach x of varlist pkg* {
    gettoken sffx croplist: croplist
    rename `x' pkg`sffx'
    label var pkg`sffx' "Avg district level `sffx' price"
}

ローカルマクロcroplistはスタックです。ループを回るたびに、スタックから一番上のアイテムを取り出し、残りを次回のために残します。ループの周りの毎回

于 2012-12-03T07:21:32.973 に答える
7

ベンは、ローカルマクロで保持されているカウンターのインクリメントについてコメントで尋ねました。

Stataのローカルマクロは、一般的に文字列を保持するためのものです。文字列文字は数字にすることができるので、数字を保持することは特殊なケースですが、当然非常に便利なケースです。このスレッドだけでいくつかの例が示されています。その歴史を念頭に置くのに役立ちます。長年の構文はフォームに基づいています

local macname <contents> 

local macname = <expression> 

最初のフォームはにコピーされmacname、2番目のフォームは結果をに割り当てる前に評価されmacnameます。カウンターをインクリメントする主な方法は、いくつかのバージョン用でした

local j = `j' + 1 

しかし構文

local ++j 

現在許可されています。ただし、許可されていますが

local j++ 

何が起こるかはマクロの最初の構文と一致していますが、期待どおりに機能しません。

したがって、これがあなたのバックグラウンドを考えると少し奇妙に見える場合、それは理解できますが、ローカルマクロは算術ではなく文字列処理を目的としていました。この点で、マタははるかに主流のようです。

ループとマクロに関するチュートリアルを

コックス、ニュージャージー州2002年。勇気を持ってリストに立ち向かう方法。Stata Journal 2(2):202-222

すべての人がアクセスできます

http://www.stata-journal.com/sjpdf.html?articlenum=pr0005

于 2012-12-10T10:16:49.947 に答える
1

Stata 12以降では、renameこのケースをいくつかの方法で処理できます。

new_croplistこのメソッドは、変数名を含む新しいマクロを作成し、パターンに従って変数の名前をで指定された名前に変更するためpkgmz pkggmz pkgsp pkgsptc pkgmil pkgcof pkgsuk pkgtea pkgricに使用します。次の番号は連続している必要はありません。renamepkg<digits>new_croplistpkg

local croplist mz gmz sp sptc mil cof suk tea ric
local new_croplist
foreach name of local croplist {
    local new_croplist `new_croplist' pkg`name'
}
rename pkg# (`new_croplist')

2番目のメソッドは、新しいrename関数を2回使用します。以前のように、これは元の名前に連続した番号を必要としません。最初のコマンドは、パターンの変数のpkg<digits>名前をで指定された名前に変更しますcroplistpkg2番目のコマンドは、新しい変数名にプレフィックスを追加します。

rename pkg# (`croplist')
rename (`croplist') pkg=

どちらの場合も、一般にrenameコマンドを使用する場合(rename groupStataのドキュメントで参照)、古い変数名の数は新しい変数名の数と一致する必要があるため、一致する変数の数が新しい変数の数と一致することを確認してpkg#ください`croplist'で指定された名前。

于 2015-06-18T22:20:27.590 に答える
0

@Nickの優れた例のようにカウンターを使用する代わりに、 以下を使用することもできmacro shiftます。

clear

forvalues i = 1 / 9 {
    generate pkg`i' = runiform()
}

local croplist mz gmz sp sptc mil cof suk tea ric
tokenize "`croplist'"

foreach var of varlist pkg* {
    rename `var' pkg`1'
    label var pkg`1' "Avg district level `1' price"
    macro shift
}

このコマンドを使用して、 :dsで始まる変数名のリストを取得することもできます。pkg

local croplist mz gmz sp sptc mil cof suk tea ric
tokenize "`croplist'"

ds pkg*

foreach var of varlist `r(varlist)' {
    rename `var' pkg`1'
    label var pkg`1' "Avg district level `1' price"
    macro shift
}

どちらの場合も、次のようになります。

pkgmz           float   %9.0g                 Avg district level mz price
pkggmz          float   %9.0g                 Avg district level gmz price
pkgsp           float   %9.0g                 Avg district level sp price
pkgsptc         float   %9.0g                 Avg district level sptc price
pkgmil          float   %9.0g                 Avg district level mil price
pkgcof          float   %9.0g                 Avg district level cof price
pkgsuk          float   %9.0g                 Avg district level suk price
pkgtea          float   %9.0g                 Avg district level tea price
pkgric          float   %9.0g                 Avg district level ric price
于 2018-05-26T20:20:48.103 に答える