2

現在、Stataで解決に取り組んでいる次の問題に直面しています。アルゴリズムタグを追加しました。これは、Stataコードではなく、主に関心のあるステップであるためです。

いくつかの変数があります。たとえば、var1-var20で、文字列を含めることができます。私はこれらの文字列の一部にのみ興味があります。それらをA、B、C、D、E、Fと呼びましょう。ただし、他の文字列も発生する可能性があります(これらはすべてXで示されます)。また、私は一意の識別子IDを持っています。データの一部は次のようになります。

ID  |  var1  |  var2  |  var3  |  ..  |  var20  
1   |   E    |        |        |      |    X
1   |        |   A    |        |      |    C
2   |   X    |   F    |   A    |      |   
8   |        |        |        |      |    E

ここで、すべてのIDと、任意の変数の文字列A、B、C、E、D、Fのいずれかが出現するたびにエントリを作成します。上記のデータは次のようになります。

ID  |  var1  |  var2  |  var3  |  ..  |  var20
1   |    E   |        |        |  ..  |       
1   |        |    A   |        |      |       
1   |        |        |        |      |    C
2   |        |    F   |        |      |
2   |        |        |    A   |      |
8   |        |        |        |      |    E

ここでは、A、B、C、D、E、またはFではない文字列Xがあるたびに無視します。これまでの私の試みは、エントリごとにA、B、の出現回数Nをカウントする変数を作成することでした。 C、D、E、F。上記の元のデータでは、その変数はN=1,2,2,1になります。次に、エントリごとに、これのN個の複製を作成します。これにより、次のデータが得られます。

ID  |  var1  |  var2  |  var3  |  ..  |  var20  
1   |   E    |        |        |      |    X
1   |        |   A    |        |      |    C
1   |        |   A    |        |      |    C
2   |   X    |   F    |   A    |      |   
2   |   X    |   F    |   A    |      |   
8   |        |        |        |      |    E

私の問題は、ここからこの問題をどのように攻撃するかです。タイトルが貧弱で申し訳ありませんが、これ以上具体的に言うことはできませんでした。

4

1 に答える 1

1

申し訳ありませんが、finallyブロックが目的の出力だと思いました(これまでに達成したことであることがわかりました)。reshapelong、then )を2回呼び出すと、真ん中のブロックを取得できますwide

まず、あなたのデータに一致するデータを生成します。

clear
set obs 4

* ids
generate n = _n
generate id = 1 in 1/2
replace id = 2 in 3
replace id = 8 in 4

* generate your variables
forvalues i = 1/20 {
    generate var`i' = ""
}
replace var1 = "E" in 1
replace var1 = "X" in 3
replace var2 = "A" in 2
replace var2 = "F" in 3
replace var3 = "A" in 3
replace var20 = "X" in 1
replace var20 = "C" in 2
replace var20 = "E" in 4

ここで、への2つの呼び出しreshape

* reshape to long, keep only desired obs, then reshape to wide
reshape long var, i(n id) string   
keep if inlist(var, "A", "B", "C", "D", "E", "F")
tempvar long_id
generate int `long_id' = _n
reshape wide var, i(`long_id') string

1つ目reshapeは、データをワイドからロングに変換します。はvar、長く変更する変数がすべて。で始まることを指定しますvar。は、とi(n id)のそれぞれの一意の組み合わせが一意の観測値であることを指定します。この呼び出しは、各スルー変数の組み合わせごとに1つの観測値を提供します。したがって、4 * 20=80の観測値があります。次に、保持したい文字列のみを保持します。nireshapenidvar1var20inlist()

2番目のreshape呼び出しvarでは、再形成する値が可変varであり、これをプレフィックスとして使用することを指定します。残りの文字ごとに1行が必要だったので、2番目の呼び出しのiインデックスとなる新しいインデックス(最終的には実際の意味はありません)を作成しました(一意の観測として-を使用した場合、最終的には次の場所に戻ります)始めましたが、良い文字列だけでした)。インデックスは最初の呼び出し(変数)から残っているため、各にどのサフィックスを付けるかはすでにわかっています。reshapenidjreshape_jreshapevar

これらの2つのreshape呼び出しは次のようになります。

. list n id var1 var2 var3 var20

     +-------------------------------------+
     | n   id   var1   var2   var3   var20 |
     |-------------------------------------|
  1. | 1    1      E                       |
  2. | 2    1             A                |
  3. | 2    1                            C |
  4. | 3    2             F                |
  5. | 3    2                    A         |
     |-------------------------------------|
  6. | 4    8                            E |
     +-------------------------------------+

2つを生き残れない変数を簡単に追加し直すことができますreshape

* if you need to add back dropped variables
forvalues i =1/20 {
    capture confirm variable var`i'
    if _rc {
        generate var`i' = ""
    }
}
于 2012-10-31T19:30:01.553 に答える