1

私は perl を使用して、最終的に Stata に取り込む .txt を介して以下をスクレイピングしています。どの形式オプションが機能しますか? 私はそのような観察をたくさん持っているので、一般化できるアプローチを使用したいと思います。

元のデータの形式は次のとおりです。

 First Name: Allen
 Last Name: Von Schmidt
 Birth Year: 1965
 Location: District 1, Ocean City, Cape May, New Jersey, USA

 First Name: Lee Roy
 Last Name: McBride
 Birth Year: 1967
 Location: Precinct 5, District 2, Chicago, Cook, Illinois, USA

目標は、Stata で変数を作成することです。

  First Name: Allen
  Last Name: Von Schmidt
  Birth Year: 1965
  County: Cape May
  State: New Jersey

  First Name: Allen
  Last Name: McBride
  Birth Year: 1967
  County: Cook
  State: Illinois

どのような .txt がそのような結果になる可能性がありますか? また、それをどのように Stata にロードしますか?

また、これらの 2 つの例のように用語の量は Location によって異なりますが、私は常に USA の前に 2 が必要です。

現時点では、.txt のテーブルの各変数を "" で囲んでいます。

 "Allen","Von Schmidt","1965","District 1, Ocean City, Cape May, New Jersey, USA"
 "Lee Roy","McBride","1967","Precinct 5, District 2, Chicago, Cook, Illinois, USA"

.txt をフォーマットするより良い方法はありますか? Stata で対応する変数を作成するにはどうすればよいですか?

ご協力ありがとうございました!

PS私は、stataがinfileまたはinsheetを使用し、変数を分離するために、またはタブを処理できることを知っています。Perl の Location のような変数をそれらすべてでスクレイピングする方法がわからなかったので、「」を追加しました

4

2 に答える 2

3

これには 2 つの方法があります。1 つ目は、データを do ファイルに貼り付け、入力を使用することです。形式がかなり規則的であると仮定すると、カンマを使用して解析することで簡単にクリーンアップできます。コンマを削除したことに注意してください。

#delimit;
input
str100(first_name last_name yob geo);
 "Allen" "Von Schmidt" "1965" "District 1, Ocean City, Cape May, New Jersey, USA";
end;

compress;
destring, replace;

split geo, parse(,);

rename geo1 district;
rename geo2 city;
rename geo3 county;
rename geo4 state;
rename geo5 country;
drop geo;

2 番目の方法は、txt ファイルから直接データを挿入することです。これはおそらく簡単です。これは、カンマが削除されていないことを前提としています。

 #delimit;
 insheet first_name last_name yob geo using "raw_data.txt", clear comma nonames;

次に、最初の例のようにクリーンアップします。

于 2013-02-15T22:38:12.533 に答える
0

これは完全な答えではありませんが、コメントが (簡単に) 許可するよりも多くのスペースと柔軟性が必要です。

1 つのトリックは、要素を端から剥がすことに基づいています。これを行う最も簡単な方法は、逆文字列の最初のコンマである最後のコンマを探し始めることです。strpos(reverse(stringvarを使用します), ",")

たとえば、最初のコンマは次のstrpos()ように検索されます

. di strpos("abcd,efg,h", ",")
5

そして最後のコンマはこのように

. di strpos(reverse("abcd,efg,h"), ",")
2

最後のコンマがどこにあるかがわかったら、最後の要素をはがすことができます。最後のコンマが逆文字列の位置 # にある場合、文字列の位置 -# にあります。

. di substr("abcd,efg,h", -2, 2)
,h

これらの例は明らかに、単一文字列の電卓スタイルの例です。ただし、最後の要素は、文字列変数全体について同様に取り除くことができます。

. gen poslastcomma = strpos(reverse(var), ",") 
. gen var_end = substr(var, -poslastcomma, poslastcomma) 
. gen var_begin = substr(var, 1, length(var) - poslastcomma) 

このようなものに慣れたら、より少ない変数でより複雑なステートメントを書くことができますが、ゆっくり、ゆっくりと段階的に学習する方が良いです.

ところで、Stata の学習者によくある間違い (私の見解では) は、文字列の問題を解決するには正規表現を使用する必要があると思い込んでしまうことです。正規表現に非常に精通している場合は、正規表現を使って素晴らしいことを自然に行うことができますが、他の文字列関数を組み合わせることも非常に強力です。

あなたの特定の例では、「USA」などの最後の要素を無視してから、次の要素を逆方向に処理するように聞こえます。

splitin Stata も問題ありません (私はファンであり、実際にその推定著者です) が、分割によって異なる数の要素が生成されると厄介な場合があります。

于 2013-02-17T14:30:52.260 に答える