Description
gsort 将观察值排列为指定变量的升序或降序,因此不同于 sort ,只能生成升序排列; see [D] sort。每个 varname可以是数字或字符串。如果在名称前面键入+或没有任何内容,则按varname 的升序排列观察值,如果键入 - 则按降序排列。
Quick start
通过升序 v1 的值对内存中的数据集进行排序,相当于 sort
gsort v1
通过降低 v1 的值对内存中的数据集进行排序,也就是降序。
gsort -v1
按 v1 的升序值和 v2 的降序值对数据集进行排序
gsort v1 -v2
创建 newv 变量,以便在后续操作中使用
gsort v1 -v2, generate(newv)
降序 v2 的缺失值放在数据集的顶部,而不是末尾
gsort v1 -v2, mfirst
Syntax
gsort [+|-] varname [[+|-] varname ...] [, generate(newvar) mfirst]
Options
generate(newvar): 创建包含创建包含1、2、3 . . . 的变量,以有序顺序表示的每一组。这在后续 by 操作中使用排序时很有用;参见[U] 11.5 by varlist:construct 和下面的例子.
mfirst: 指定缺失值首先按降序排列,而不是最后排序。
Remarks and examples
gsort 几乎是一个与插件兼容的 sort 替代品,除了你不能用gsort指定一般的 varlist 。 例如,排序 alpha-gamma意味着按照 α 的升序对数据进行排序,在相同的 alpha 值内; 排序数据集中的下一个变量(可能是 beta ),在alpha和beta的相等值范围内; gsort alpha-gamma将被解释为gsort alpha -gamma,意思是按照alpha的升序对数据进行排序,并在alpha的相等值内按照gamma的降序对数据进行排序。
Example 1
除了 varlist 解释的差异,gsort可以用来代替排序。 列出数据中价格最低的10辆汽车
use http://www.stata-press.com/data/r15/auto
gsort price
list make price in 1/10
或者,如果我们愿意,
gsort +price
list make price in 1/10
要列出数据中价格最高的10辆汽车,我们可以输入
gsort -price
list make price in 1/10
gsort 也可以与字符串变量一起使用。要按反向字母顺序列出所有品牌,我们可以输入
gsort -make
list make
Example 2
gsort 可以与多个变量一起使用。 给出每位患者多次观察的医院患者的数据集,输入
use http://www.stata-press.com/data/r15/bp3
gsort id time
list id time bp
按照测量顺序列出每位患者的血压。 如果我们输入
gsort id -time
list id time bp
然后每个患者的血压将按相反的时间顺序列出。
Technical note
假设我们希望在每个患者的记录中附上住院期间观察到的最低和最高血压。 实现这一结果的更简单方法是使用egen 的 min() 和 max() 函数:
egen lo_bp = min(bp), by(id)
egen hi_bp = max(bp), by(id)
See** [D] egen**. Here is how we could do it with gsort:
use http://www.stata-press.com/data/r15/bp3, clear
gsort id bp
by id: generate lo_bp = bp[1]
gsort id -bp
by id: generate hi_bp = bp[1]
list, sepby(id)
即使存在缺失的 bp 值,这仍然有效,因为无论排序的方向如何,这些缺失值都排列在排列的最后。
Technical note
假设我们有一个包含x的数据集,我们希望获得正向和反向累积。 前向累积定义为F(X)=观察的分数,使得 x≤X 。再次让我们忽略获得前向累积的更简单方法,即使用 Stata 的cumul 命令,
set obs 100
generate x = rnormal()
cumul x, gen(cum)
sort x
by x: generate cum = _N if _n==1
replace cum = sum(cum)
replace cum = cum/cum[_N]
也就是说,我们首先按x的升序放置数据; 我们使用了排序但可以使用gsort 。 接下来,对于 x 的每个观测值,我们生成了包含该值的观测数量(您可以将其视为离散密度)。 我们将密度求和,得到分布,最后将其归一化为1。
反向 cumulative G(X) 定义为数据的分数,使得 x≥X 。为了得到这个,我们可以尝试简单地反转排序:
gsort -x
by x: generate rcum = _N if _n==1
replace rcum = sum(rcum)
replace rcum = rcum/rcum[_N]
可行,除了一个细节:Stata 会抱怨数据没有在第二行排序。 Stata抱怨因为它不理解降序排序(gsort 是一个 ado 文件)。 解决这个问题,gsort 的 generate()选项将创建一个按升序排列的新分组变量(从而满足 Stata 的狭义定义),也就是说,根据它定义的组,与真正的排序变量相同:
gsort -x, gen(revx)
by revx: generate rcum = _N if _n==1
replace rcum = sum(rcum)
replace rcum = rcum/rcum[_N]