无法用变量评估if语句

时间:2014-04-14 19:18:47

标签: stata

我有很多其他编程语言的经验,但是我对Stata语法有很多困难。如果我输入值,我会得到一个没有问题的评估语句,但我无法弄清楚为什么它不会像我期望的那样评估变量。

 gen j=5

 forvalues i = 1(1)5 {
    replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
    replace j=`j'-1
 }

如果我分别用1和5替换ij,就像我期望从上面的代码中发生一样,那么它工作正常,但我得到if not found错误否则,谷歌搜索时没有产生有意义的结果。有谁看到我没看到的?我讨厌蛮力一些可以通过循环完成的东西。

1 个答案:

答案 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对你上一个问题的回复中提出了类似的观点,但你不想相信它!)