Stata如何实现在某变量特定值后插入新行?

想在keys字段特定的字母“f”后插入一新空行。具体而言,只要某条记录keys变量的值出现“f”,就在该记录后插入一条空记录,Stata的演示数据如下:

/*读取演示数据*/
clear
input byte num str1 keys
 1 "a"
 2 "b"
 3 "c"
 4 "d"
 5 "e"
 6 "f"
 7 "a"
 8 "b"
 9 "c"
10 "d"
11 "e"
12 "f"
13 "a"
14 "b"
15 "c"
16 "d"
17 "e"
18 "f"
19 "a"
20 "b"
21 "c"
22 "d"
23 "e"
24 "f"
25 "a"
26 "b"
27 "c"
28 "d"
29 "e"
30 "f"
end

查看keys字段“f”值的分布情况,Stata命令如下:

/*查看出现的频数*/
count if keys[_n]=="f"
/*查看出现的行数*/
list if keys[_n]=="f"

全部程序操作的Stata命令如下:

/*这段命令很关键,生成循环的总行数(5+30)*/
count if keys=="f"
tempvar Plus
gen `Plus'=r(N)+_N
local tol_Lian=`Plus'
/*循环,当某条记录为f值,在其后插入空记录*/
forvalues n=1(1)`tol_Lian' {
     if keys[`n']=="f" {
     insobs 1, after(`n') 
     }
}	 

上述用到了局部宏(local macro),可以仔细体会一下用法。使用临时变量(tempvar)的目的是为了不生成额外的变量污染数据库。

还可以再简化,去掉临时变量的中间步骤,Stata代码如下:

/*删除添加的空行*/
drop if missing(num,keys)
/*设置局部宏为循环的总行数(5+30)*/
count if keys=="f"
local tol_Lian= r(N)+_N
/*循环,当某条记录为f值,在其后插入空记录*/
forvalues n=1(1)`tol_Lian' {
     if keys[`n']=="f" {
     insobs 1, after(`n') 
     }
}  

完,本文内容交流请移步:http://www.epiman.cn/thread-152434-1-1.html