想在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