相对于另一个变量重新排序Stata变量

时间:2013-02-04 18:10:15

标签: variables stata

我有这些数据:

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

我需要复制名为“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 , stablebysort,但他们似乎并不适合。

谢谢!

2 个答案:

答案 0 :(得分: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或更早版本中,使用个人renamerenvars(Stata Journal)。

答案 1 :(得分:1)

基于此merge版本的此数据集本身会有一种聪明的方式,有人应该很高兴向您展示。

我将向您展示一种非常行人的方法,它可能具有一个优点,即遵循它是相当透明的。

我假设您的变量名为nodetimenode2,并且您的time是字符串变量。

首先我们将观察数放在一个变量中:

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之后留在内存中:它是最小值,如果每个节点在数据中恰好出现一次,它将是我们想要的值。 r(max)甚至r(mean)也可以正常运作。 `= _N'动态评估数据集中的观测数量。