2016-08-05 163 views
0

私はmy_varと呼ばれる10桁の長い文字列 "0000000000"を持っています。私は2つの変数highclass(0と10の間)とlowclass(0と10の間)を持っています。Stata文字列の置換

私はわからない行は= 5 highclassと= 1 lowclassを持っている場合は、 my_varが1111100000.

になるはず、例えば1

highclasslowclass間の数字を変換する必要があり

変数を参照する必要があるので、部分文字列コマンドが私を助けてくれます。

+0

変数名にはスペースを使用できません。アンダースコアを含むことができます。私は 'highclass'と' lowclass'のバリエーションを同じ名前に編集しました。私が間違っていると思われる場合は、コードを変更する必要があります。 –

+1

良い質問は、再現可能なデータの例を示し、コードで明示的な試行を示します。 –

答えて

2

私が理解しているように、は、最初の1の位置であり、highclassは、最後の1の位置です。

ループは必要ありません。実際、Stataでは1つのステートメントが実行されます(これは問題の言語です)。それを行うには

二つの方法:

古いスタイル(以下、特にStataの12に関連して)

ここで私はそれがそのように明確である疑いがあるので、私は、いくつかの中に単一の文を分割しています。 substr()(not substring())はコマンドではなく、関数であることに注意してください。

clear 
input str10 my_var lowclass highclass 
"0000000000" 1 5 
"0000000000" 2 4 
"0000000000" 3 3 
"0000000000" 1 10 
"0000000000" 7 10 
end 

local zeros "0000000000" 
local ones "1111111111" 
replace my_var = substr("`zeros'", 1, lowclass - 1) 
replace my_var = my_var + substr("`ones'", 1, highclass - lowclass + 1) 
replace my_var = my_var + substr("`zeros'", 1, 10 - highclass) 

list 

    +----------------------------------+ 
    |  my_var lowclass highcl~s | 
    |----------------------------------| 
    1. | 1111100000   1   5 | 
    2. | 0111000000   2   4 | 
    3. | 0010000000   3   3 | 
    4. | 1111111111   1   10 | 
    5. | 0000001111   7   10 | 
    +----------------------------------+ 

(アップのStata 13)新スタイル

マタとのStata 13は、最大文字列の乗算、(例えば10 * "1")を許可するので、これは動作します:例えば

replace my_var = (lowclass - 1) * "0" + (highclass - lowclass + 1) * "1" + (10 - highclass) * "0" 

注意を-1 * "0"は完全に合法ですが、欠落(空の文字列)として評価されます。