この質問はStatalistにも投稿されました。これが私の答えです。merge
問題が 2 つ以上のファイルで始まる場合を除き、私は s を使用しない傾向があります。
clear
input obs yr str4 var1 str4 var2 str4 var3
1 90 str1 str2 str3
1 91 str1 str4 str5
2 90 str3 str4
2 91 str4 str5
2 93 str3 str5
2 94 str7
end
reshape long var , i(obs yr) j(which)
bysort obs var (yr) : gen new = _n == 1 & !missing(var)
bysort obs yr : replace new = sum(new)
by obs yr : replace new = new[_N]
reshape wide var, i(obs yr) j(which)
(MORE) さらなるコメントは主に効率性に焦点を当てており、ここではスペースではなく速度を意味します。(保管スペースがポスターを噛む可能性があります。)
ここで を使用して再構築しないreshape
と、問題は 3 つのループになります。つまり、識別子、各識別子の観測、および変数です。おそらく、外側の 2 つのループを 1 つに折りたたむことができます。しかし、観測に対する明示的なループは、通常、Stata では低速です。
Dimitriy と私が提案した再構築ソリューションでは、by:
操作はコンパイルされたコードに直接移行し、比較的高速です。reshape
コードは解釈され、ファイル操作を伴うため、遅くなる可能性があります。一方reshape
で、ある程度の経験があればすぐに書き留めることができ、経験に伴う流暢さを習得することは本当に価値がreshape
あります。のヘルプと手動入力に加えて、http://www.stata.com/support/faqs/data-management/problems-with-reshape/に書いreshape
た FAQ を参照してください。reshape
もう 1 つの考慮事項は、この種のデータセットで他に何をしたいかです。似たような性質の問題が他にもある場合は、通常、 によって生成されるような長い構造の方が簡単になるreshape
ため、その構造を維持することをお勧めします。