1

Stata にインポートしたい大きな .dat ファイルがあります。.dat ファイルは、観測ごとに複数の行を持つ 2 つの長い列です。さまざまな行から変数を作成したい。問題は、lrecl(#) を使用できないことです。これは、観察の長さが異なる行数であり、1 つの観察がいつ終了し、別の観察が開始されるかを決定する文字列があるためです。.dat ファイルは次のようになります (行を // で区切っています)。

PATN// WKU D03321703// SRC 7// APN 5583950// PATN// WKU D03321711// SRC 7// APN 5455359// APT 4// ART 294// APD 19900627// PATN// WKU D03321912// SRC 7// APN 5455432// APT 4// ART 294// APD 19900456

各観測は「PATN」で始まります。後続の列を使用して変数、たとえば、WKU、SRC、APN、および APT を作成するように infile に指示したい (次のように: infix str WKU 5-13 SRC 5 APN 5-11 APT 5)。次に、次の「PATN」を見つけます。次の観測を開始します。したがって、文字列「PATN」を見つけるために必要なだけでなく、「.」を残すためにも必要です。その観測に APN が存在しない場合。

4

1 に答える 1

3

あなたの例をファイルに入れました。いくつかのコードが続きます。それが何をするかをもっと理解するには、lists をふりかけます。

ここでの哲学は単純です。場合によっては、データ入力内で多くのことをしようとすることがあります。データセットを区別されていないテキストと同じくらい簡単に読み取り、Stata 内で操作することができます。観測ブロックの定義、隣接する線の結合、文字列の分割、データセット全体の再形成はすべて役に立ちます。

 
testtext.dat を使用した infile str244 テキスト、クリア
gen long id = sum(テキスト == "PATN")
テキスト == "PATN" の場合は削除
replace text = text + " " + text[_n+1] if inlist(text, "APD", "APT", "APN", "ART", "WKU", "SRC")
inlist(word(text[_n-1], 1), "APD", "APT", "APN", "ART", "WKU", "SRC") の場合はドロップします
テキストを分割する
テキストをドロップ
rename (text1 text2) (何を)
i(id) j(what) 文字列
レンフィックス


. l

     +---------------------------------------------------------------- ------+
     | | id APD APN APT アート SRC WKU |
     |---------------------------------------------------------------- ------|
  1. | 1 5583950 7 D03321703 |
  2. | 2 19900627 5455359 4 294 7 D03321711 |
  3. | 3 19900456 5455432 4 294 7 D03321912 |
     +---------------------------------------------------------------- ------+

更新:これはさらに簡単です:

 
testtext.dat を使用して str テキスト 1 ~ 244 をインフィックスし、クリアします。
gen long id = sum(テキスト == "PATN")
テキスト == "PATN" の場合は削除
テキストを分割する
rename (text1 text2) (何を)
テキストをドロップ
i(id) j(what) 文字列
レンフィックス
リスト
于 2013-10-29T17:25:10.273 に答える