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

Variables 相对于另一个变量对Stata变量重新排序,variables,stata,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

我有这些数据:

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
在斯塔塔这可能吗?我一直在研究排序、稳定排序和按排序排序,但它们似乎不适合这一点

谢谢


将有一种聪明的方法,它基于将此数据集的一个版本与其自身进行
合并
,应该会有人乐意向您展示

我将向你们展示一个非常普通的方法,它可能有一个优点,即它是相当透明的

我假设您的变量被称为
node
time
node2
,并且您的
time
是一个字符串变量

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

gen long obs = _n 
然后我们初始化一个新的时间变量。如果
时间
为数字,则初始化应改为数字缺失:

gen time2 = "" 
现在我们循环观察。对于每个观察,我们找出哪个观察编号包含新节点编号的数据,然后使用该观察的
time

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

r(min)
summary
之后保留在内存中:它是最小值,如果每个节点在数据中精确出现一次,它将是我们想要的值
r(max)
甚至
r(mean)
也同样有效`=_N'动态计算数据集中的观察数

这里有一个
合并
解决方案。我将您的玩具数据集放入
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) |
      +------------------------------------------------+

重命名
语法采用Stata 12。在Stata 11或更早版本中,使用单个
重命名
s或
renvars
(Stata日志)

谢谢你,尼克!事实上,我描述的第一个数据集是合并的结果,因此我想到了基于变量“reorder node”进行第二次合并。每个节点在数据中出现很多次,因此两次合并可能是最好的方式。只要每个节点的多个观测值的时间是恒定的,上述方法应该可以很好地工作。只需使用
r(最小值)
r(最大值)
;不要使用
r(平均值)
,它可能是非整数和/或与适当的观察值不对应。因此,如果节点出现在观测值42和44中,则平均值43将不是要使用的观测值,但42或44将很好。