ID A1 A2 A3
1001 ABD AAA ABC
1002 ABE BBB CCC
1003 ABC CCC DDD
我有一个循环如下:
generate trackr = 0
display "generated trackr"
foreach var of varlist a1 a2 a3{
display "`var'" id[_n]
replace trackr = 1 if (`var'=="ABC")
}
在 Stata 中,我想找出并打印何时对trackr
进行更改.(我想找出在哪一行/列中发现了"ABC"。
我尝试了上述id[_n]
,它只能部分工作。
我想仅显示id[_n]
if var=="ABC"
并将trackr
更改为 1(从 0(。 我尝试将所有内容都放在一个if
块中,但我认为 Stata 中的if
的工作方式不同?
你不需要循环来表示你似乎想要的东西。请参阅 SSC 的dataex
,了解在 Stata 问题中提供示例数据的更好方法。
clear
input ID str3 (A1 A2 A3)
1001 ABD AAA ABC
1002 ABE BBB CCC
1003 ABC CCC DDD
end
gen trackr = inlist("ABC", A1, A2, A3)
list if inlist("ABC", A1, A2, A3)
+---------------------------------+
| ID A1 A2 A3 trackr |
|---------------------------------|
1. | 1001 ABD AAA ABC 1 |
3. | 1003 ABC CCC DDD 1 |
+---------------------------------+
在这里,如果第二个和后面的参数中的任何一个等于第一个参数,则inlist()
产生 1,否则为 0。
在您的循环中,像display A1[_n]
这样的东西只会显示第一个观测值,因为您循环遍历变量,而不是观测值。但是不需要循环。
如果你只希望看到满足你的标准的第一个观察结果,一种方法是
. list if trackr & sum(trackr) == 1
+---------------------------------+
| ID A1 A2 A3 trackr |
|---------------------------------|
1. | 1001 ABD AAA ABC 1 |
+---------------------------------+
因此,list if sum(inlist("ABC", A1, A2, A3)) == 1
也将努力找到第一个这样的观察结果。