1

私はこれらのデータを持っています:

Node    Time    Reorder Node
201    8:00:00  395
395    8:10:00  405
280    7:50:00  280
405    8:30:00  201

最初の 2 列のノード番号と時間の関係が保持されるように、"Time" というベクトルをコピーして並べ替える必要があります。言い換えれば、私はこれで終わりたいです:

Node    Time    Reorder Node    Reorder time
201      8:00:00    395         8:10:00
395      8:10:00    405         8:30:00
280      7:50:00    280         7:50:00
405      8:30:00    201         8:00:00

これはStataで可能ですか?私はsort , stableandを見てきましbysortたが、これには適していないようです。

ありがとう!

4

2 に答える 2

2

これがmerge解決策です。あなたのおもちゃのデータセットを に入れましたds1.dta

. use ds1, clear

. list 

       +------------------------+
       | node      time   node2 |
       |------------------------|
    1. |  201   8:00:00     395 |
    2. |  395   8:10:00     405 |
    3. |  280   7:50:00     280 |
    4. |  405   8:30:00     201 |
       +------------------------+

 . rename (node node2 time) (node2 node time2) 

 . merge 1:m node using ds1

     Result                           # of obs.
    -----------------------------------------
    not matched                             0
    matched                                 4  (_merge==3)
    -----------------------------------------

  . list 

      +------------------------------------------------+
      | node2     time2   node      time        _merge |
      |------------------------------------------------|
   1. |   405   8:30:00    201   8:00:00   matched (3) |
   2. |   280   7:50:00    280   7:50:00   matched (3) |
   3. |   201   8:00:00    395   8:10:00   matched (3) |
   4. |   395   8:10:00    405   8:30:00   matched (3) |
      +------------------------------------------------+

rename構文は Stata 12 を想定しています。Stata 11 以前では、個々renameの s またはrenvars(Stata Journal) を使用します。

于 2013-02-05T11:12:41.040 に答える
1

mergeこのデータセットのバージョン自体に基づいて、誰かが喜んで見せてくれる巧妙な方法があります。

私は非常に平凡な方法を紹介しようと思いますが、これにはおそらく 1 つの利点があります。

あなたの変数はと呼ばれnode、あなたは文字列変数であると仮定します。timenode2time

まず、観測番号を変数に入れます。

gen long obs = _n 

次に、新しい時間変数を初期化します。timeが数値の場合、初期化は代わりに欠落している数値にする必要があります。

gen time2 = "" 

次に、観測をループします。観測ごとに、どの観測番号に新しいノード番号のデータが含まれているかを調べ、timeその観測の値を使用します。

quietly forval i = 1/`=_N' { 
    su obs if node == node2[`i'], meanonly 
    replace time2 = time[r(min)] in `i' 
} 

r(min)の後にメモリに残されますsummarize。これは最小値であり、各ノードがデータ内で正確に 1 回発生する場合に必要な値になります。r(max)またはr(mean)同様に機能します。`=_N' は、その場でデータセット内の観測数を評価します。

于 2013-02-04T18:50:43.037 に答える