【问题标题】:Reorder Stata variable with respect to another variable相对于另一个变量重新排序 Stata 变量
【发布时间】:2013-02-04 18:10:15
【问题描述】:

我有这些数据:

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

谢谢!

【问题讨论】:

    标签: variables stata


    【解决方案1】:

    这是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)。

    【讨论】:

      【解决方案2】:

      将有一个聪明的方法基于此数据集的一个版本的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' 动态评估数据集中的观察次数。

      【讨论】:

      • 谢谢尼克!事实上,我描述的第一个数据集是合并的结果,所以我想到要根据我称为“重新排序节点”的变量进行第二次合并。每个节点在数据中出现多次,因此两次合并可能是最好的方法。
      • 只要每个节点的多次观察的时间是恒定的,上述方法应该可以正常工作。只需使用r(min)r(max);不要使用r(mean),它可能是非整数和/或不对应于适当的观察。因此,如果一个节点出现在观测值 42 和 44 中,则平均值 43 将不是要使用的观测值,但 42 或 44 就可以了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多