If statement 如何将'if'与Stata中的本地宏一起使用?

If statement 如何将'if'与Stata中的本地宏一起使用?,if-statement,local,stata,If Statement,Local,Stata,我试图将2012年的收入分配给当地人。因此,本地val_AK在“AK”州的值为income,val_AL在“AL”州的值为income。。。。这是你的电话号码 以下代码生成aknotfoundr(111)但是AK确实存在于新南威尔士州中,这是一个字符串变量: foreach i in "AK" "AL" "AR" "AZ" { if (state_nsw=="`i'" & year==2012) { local val_`i'=income} } 我还尝试使用了以下

我试图将2012年的
收入
分配给当地人。因此,本地
val_AK
在“AK”州的值为
income
val_AL
在“AL”州的值为
income
。。。。这是你的电话号码

以下代码生成
aknotfoundr(111)
但是
AK
确实存在于新南威尔士州
中,这是一个字符串变量:

foreach i in "AK" "AL" "AR" "AZ" {
     if (state_nsw=="`i'" & year==2012) { local val_`i'=income}
     }
我还尝试使用了以下方法:

if (state_nsw=="`i'" ...
...
// and got invalid name r(198)

我的错误在哪里?

我仍然无法打开数据。请尝试以下操作:

foreach i in "AK" "AL" "AR" "AZ"{
    gen val_`i'=income if state_nsw=="`i'" & year==2012
    local val `val' val_`i'
    }

Sample data and output: 
state   val year
AK  13  2010
AL  112 2010
AR  12  2010
AZ  14  2010


    val_AK  val_AL  val_AR  val_AZ  
    13              
            112         
                    12      
                             14 

我仍然无法打开数据。请尝试以下操作:

foreach i in "AK" "AL" "AR" "AZ"{
    gen val_`i'=income if state_nsw=="`i'" & year==2012
    local val `val' val_`i'
    }

Sample data and output: 
state   val year
AK  13  2010
AL  112 2010
AR  12  2010
AZ  14  2010


    val_AK  val_AL  val_AR  val_AZ  
    13              
            112         
                    12      
                             14 

由于
state\u nsw
是一个字符串变量,因此只能与文本字符串或另一个字符串变量进行比较

简化到循环中的第一个值

foreach i in "AK" {
    if (state_nsw == `i' & year == 2012) { local val_`i'=income }
}
内部语句被解释为

    if (state_nsw == AK & year == 2012) { local val_AK = income } 
    local val_`i' = income[1] 
现在就Stata而言,
AK
不是一个文本字符串,因此它只能是字符串变量的名称。但是你没有这样的变量,这就是为什么你会犯这样的错误。更合适的是

    if (state_nsw == "AK" & year == 2012) { local val_AK = income } 
或者,更一般地说

   if (state_nsw == "`i'" & year == 2012) { local val_`i'=income }
那么,为什么会出现错误
无效名称r(198):

通过查看您的代码,我无法回答这个问题,但请参见下文

你的麻烦还没有结束。你的代码很混乱

  • if
    语句将参照第一次观察进行解释。这一点在

  • 同样地

    local val_`i' = income 
    
将始终被解释为

    if (state_nsw == AK & year == 2012) { local val_AK = income } 
    local val_`i' = income[1] 
不管
if
命令如何

  • 如果
自第8版以来已过期,并且可能无法按照您的意愿工作,则将{}放在
之后的同一行上

应该起作用的是

  foreach i in AK AL AR AZ { 
      su income if year == 2012 & state_nsw == "`i'", meanonly 
      local val_`i' = r(mean) 
  }

虽然你为什么要这么做是个谜

由于新南威尔士州是一个字符串变量,因此只能与文字字符串或其他字符串变量进行比较

简化到循环中的第一个值

foreach i in "AK" {
    if (state_nsw == `i' & year == 2012) { local val_`i'=income }
}
内部语句被解释为

    if (state_nsw == AK & year == 2012) { local val_AK = income } 
    local val_`i' = income[1] 
现在就Stata而言,
AK
不是一个文本字符串,因此它只能是字符串变量的名称。但是你没有这样的变量,这就是为什么你会犯这样的错误。更合适的是

    if (state_nsw == "AK" & year == 2012) { local val_AK = income } 
或者,更一般地说

   if (state_nsw == "`i'" & year == 2012) { local val_`i'=income }
那么,为什么会出现错误
无效名称r(198):

通过查看您的代码,我无法回答这个问题,但请参见下文

你的麻烦还没有结束。你的代码很混乱

  • if
    语句将参照第一次观察进行解释。这一点在

  • 同样地

    local val_`i' = income 
    
将始终被解释为

    if (state_nsw == AK & year == 2012) { local val_AK = income } 
    local val_`i' = income[1] 
不管
if
命令如何

  • 如果
自第8版以来已过期,并且可能无法按照您的意愿工作,则将{}放在
之后的同一行上

应该起作用的是

  foreach i in AK AL AR AZ { 
      su income if year == 2012 & state_nsw == "`i'", meanonly 
      local val_`i' = r(mean) 
  }


虽然你为什么要这么做是个谜

在哪里定义了
j
?请给我们工作的样本数据。谢谢@Metrics的回复
j
是本年度的本地代码…我将更正上面的代码…我们可以忽略j…它工作正常…我刚刚更正了代码我很抱歉。你还收到错误吗?是的,我不知道为什么…我认为这与“`AK'”有关。你有样本数据要发布吗?在哪里定义了
j
?请给我们工作的样本数据。谢谢@Metrics的回复
j
是本年度的本地代码…我将更正上面的代码…我们可以忽略j…它工作正常…我刚刚更正了代码我很抱歉。你还收到错误吗?是的,我不知道为什么…我认为这与“`AK'”有关。你有样本数据要发布吗?@Metrics不起作用。充其量
val
将只包含复制到它的最后一个字符串,
val_AZ
,这是没有用的。我让它工作了,但问题是
val
包含字符串,但income@Nick:谢谢。根据您的解决方案,此问题现已更正。@度量仍然不起作用。您正在累积字符串值(变量名),而不是它们包含的数值。此外,在任何情况下,试图在宏中放入数值变量都是徒劳的。您可以使用
separate
更简洁地实现这一点。OP出于某种原因需要本地值。@无法使用的度量。充其量
val
将只包含复制到它的最后一个字符串,
val_AZ
,这是没有用的。我让它工作了,但问题是
val
包含字符串,但income@Nick:谢谢。根据您的解决方案,此问题现已更正。@度量仍然不起作用。您正在累积字符串值(变量名),而不是它们包含的数值。此外,在任何情况下,试图在宏中放入数值变量都是徒劳的。您可以使用
separate
更简洁地实现这一点。OP出于某种原因需要本地值。另外,请检查
year
是否为字符串变量。谢谢。但它的工作方式并不是我想要的:本地
val\u AL
并不存在。我试过:重新编码收入重量。='val'u AL'我得到了一个错误,“val'u AL”是未知的。这是没有意义的。您可能指的是
`val_AL'
`val_AK'
当您引用本地宏时,您需要打开和关闭引号。是的,这就是我的意思。这是一个我尝试过的输入法:重新编码income\u nsweight.=“val\u AL”-并在规则中获得unknow el。另外,检查
year
是否为字符串变量。谢谢。但它的工作方式并不是我想要的:本地
val\u AL
并不存在。我试过:重新编码收入重量。='val'u AL'我得到了一个错误,“val'u AL”是未知的。这是没有意义的。您可能指的是
`val_AL'
`val_AK'
当您引用本地宏时,您需要打开和关闭引号。是的,这就是我的意思。这是一个尝试的类型:重新计算收入