2

私はforvaluesループを持っています:

forvalues x = 1(1)50 {
   /* Code goes here */
}

の代わりに50、理想的には、その値が次のようになることを望みます。変数がありますname。しましょうlength = length(name)。の最大値が何であれ、lengthそれを の代わりにしたいと思い50ます。forvalues終点が直接数値で示されていないループの書き方がわかりませんでした。

次のように変数の最大長を推測できると考えています。

gen id = 1
gen length = length(name)
by id, sort: egen maxlength = max(length)

forそこから、この値をループに格納する方法がわかりません。

あるいは、これはwhileループでより適切にコーディングできますか?

何かのようなもの:

gen x = 1
while (x <= maxlength) {
   /* Same Code Here */
   replace x = x + 1
}
4

4 に答える 4

3

私が読んだドキュメントに基づいて、マクロを使用することは可能ですが、 forvalues ループ内で範囲の終わりを変更しても、ループが発生する回数には影響しないことに注意してください。たとえば、forvalues ループの開始時に length(name) が 50 の場合、ループ内で name の長さを変更しても、50 回しかループしません。

技術的には、forvalues は範囲の末尾がリテラル値である場合に使用することを意図していたため、while ループを使用したほうがよいでしょう。forvalues ループを使用できますが、while ループを使用する必要があります。

これを裏付けるソースは次のとおりです 。 http://www.stata.com/manuals13/pforvalues.pdf

具体的には:

テクニカルノート と入力するのは正当な構文ではありません。スカラー x = 3 . forvalues i = 1(1) x' { 2. local x =x' + 1 3. `i' を表示します 4. } forvalues にはリテラルの数値が必要です。次のテクニカル ノートに示すように、マクロの使用が許可されます。

と:

次のテクニカル ノートに示すように、マクロの使用が許可されます。テクニカルノート ループ境界の値は、ループが最初に実行されるたびに決定されます。ループ境界を変更しても効果はありません。たとえば、無限ループは作成されません。n がもともと 3 の場合、ループは 3 回実行されます。

local n 3

 forvalues i = 1(1)`n' {

 local n = `n' + 1

display `i'

}

Output:

1

2

3
于 2013-07-22T20:38:38.793 に答える
2

これが、あなたに役立つと思われるStataのトリックです。私は Stata データセットのデータ auto を使用しています。

sysuse auto 

ここで変数を と仮定しnameますprice。次に、可変価格の長さが必要です。

sum price 
gen length=r(N)

を実行した後にr(N)タイプを確認するには、 .return listsum price

あなたのループでは次のようになります:(@Nickに従って更新)

forvalues x = 1/`r(N)'{
   /* Code goes here */
}

また:

 local length=r(N)
   forvalue i=1/`length'{

  dis "`i'" 
   }

:なぜあなたが欲しいのかは明らかではありません。for loopしたがって、私の答えはあなたが求めたものだけに制限されています。

于 2013-07-22T23:15:09.150 に答える