我有很多其他编程语言的经验,但是我对Stata语法有很多困难。如果我输入值,我会得到一个没有问题的评估语句,但我无法弄清楚为什么它不会像我期望的那样评估变量。
gen j=5
forvalues i = 1(1)5 {
replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
replace j=`j'-1
}
如果我分别用1和5替换i
和j
,就像我期望从上面的代码中发生一样,那么它工作正常,但我得到if not found
错误否则,谷歌搜索时没有产生有意义的结果。有谁看到我没看到的?我讨厌蛮力一些可以通过循环完成的东西。
答案 0 :(得分:4)
一旦你以正确的方式接近它就容易理解!
问题1.您从未定义过本地宏j
。这本身并不是错误,但通常会导致错误。不存在的宏等同于空字符串,因此Stata在此示例中看到代码
if TrustBusiness_local2==`j'
as
if TrustBusiness_local2==
这是非法的;因此错误消息。
问题2.您称为j
的变量与名为j
的本地宏之间没有原则关联,但使用单引号引用。 Stata中的变量是数据集中的变量(即列);这并不意味着任何编程语言意义上的变量。变量意味着单个值可以在标量内或宏内保存在Stata中。将常数置于变量Stata意义上是合法的,但通常是不好的风格。例如,如果您有数百万个观察值,那么现在您有一列j
,其中包含数百万的值5。
问题3.你可以合法地去
local j "j"
所以现在本地宏j
包含文本"j"
,这取决于你如何使用它可以被解释为变量名。很难理解你为什么要这么做,但这是合法的。
问题4.您的整个示例甚至不需要循环,因为它似乎意味着
replace TrustBusiness_local= 6 - TrustBusiness_local2 if inlist(TrustBusiness_local2, 1,2,3,4,5)
并且,根据您的数据,if
限定符可能是多余的。翻转5(1)1到1(1)5只是从6减去的问题。
问题5.您以Stata风格编写的循环示例可能是
local j = 5
forvalues i = 1/5 {
replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
local j=`j'-1
}
它可以更简洁,但问题4不需要循环,我会把它留在那里。
问题6.就Stata而言,您所谈论的内容并非if
语句,因为您的示例中使用的if
限定符与{{1}不同命令。
将一种语言的行话翻译成另一种语言的问题可能具有挑战性。在http://www.stata.com/statalist/archive/2008-08/msg01258.html看到我的评论。经过其他语言的经验,Stata的宏观操作对我来说似乎也很奇怪;它们可能最好被理解为等同于shell编程。
我不会尝试通过谷歌搜索Stata。从头到尾阅读[U]。 (在use value label in if command in Stata对你上一个问题的回复中提出了类似的观点,但你不想相信它!)