我有这些数据:
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 , stable
和bysort
,但他们似乎并不适合。
谢谢!
我
答案 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或更早版本中,使用个人rename
或renvars
(Stata Journal)。
答案 1 :(得分:1)
基于此merge
版本的此数据集本身会有一种聪明的方式,有人应该很高兴向您展示。
我将向您展示一种非常行人的方法,它可能具有一个优点,即遵循它是相当透明的。
我假设您的变量名为node
,time
和node2
,并且您的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'动态评估数据集中的观测数量。