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

我需要复制名为“时间”的向量并对其重新排序,以便保留前两列中节点号和时间之间的关系。换句话说,我想结束这个:

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他们似乎不适合这个。

谢谢!

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 或更早版本中,使用单个renames 或renvars(Stata Journal)。

于 2013-02-05T11:12:41.040 回答
1

会有一个聪明的方法基于merge这个数据集的一个版本本身,有人应该很高兴向你展示。

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

我假设您的变量被调用nodetime并且node2time是一个字符串变量。

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

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' 动态评估数据集中的观察次数。

于 2013-02-04T18:50:43.037 回答