|
这是之前自己编的(太繁杂,仅供娱乐哈~~):
*=================== s l t o p ==================
*===========取出每组前n行观察值====keep========调试成功!!2014年10月12日16:00:03
*-假如保留每组前5行,现有一组只有3行,不足5行
*那么这3行全部保留,其余>=5行的保留前5行
* year var2 year var2
* 2000 * 2000
* 2000 * 2000
* 2000 * 2001 //不足2个记录,将全部保留
* 2001 * sltop 2 year 2002
* 2002 * =============> 2002
* 2002 * 2003
* 2002 * 2003
* 2003 *
* 2003 *
* 2003 *
*--------------------------------------------------
cap program drop sltop
program define sltop
version 13.0
syntax varname , Select(numlist min=1 max=1) //exp: sltop year , select(10)
global n=`select' //取出每组前n行
*------------------------------------------------------
tempvar id
tempvar select
egen `id'=group(`varlist') //标识组的变量
gsort `id'
gen byte `select'=0
loc j=1
loc i=0
while `j'<=_N {
if `id'[`j'] ~= `i' {
loc k=1
while (`k'<=$n) & (`j'<=_N ) & (`k'>0) {
qui replace `select'=1 in `j' //注意replace v=100 in 1和v[1],后者用于返回值
loc ++k
loc ++j
if (`id'[`j']-`id'[`j'-1]) ~= 0 {
loc k=-1
loc a=`1'[`=`j'-1']
dis _n in g "原文件变量" in w "`1'" in g "第`j'个观察值" in w "`a'" _n in g ///
"所在组别记录数<=设定的保留数,将全部保留!"
}
}
loc ++i
}
else {
loc ++j
}
}
keep if `select' == 1
end
|