如何在Stata中使用`if`和本地宏?

时间:2013-06-23 21:38:31

标签: if-statement local stata

我正在尝试将2012年的income值分配给当地人。因此,当地val_AK在州“AK”中的值为income时,val_AL在州“AL”中的值为income ....这是{ {3}}

以下代码生成AK not found r(111);AK中确实存在state_nsw,这是一个字符串变量:

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

我也尝试过使用Stata 11 version of .dta而且:

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

我的错误在哪里?

2 个答案:

答案 0 :(得分:4)

由于state_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 } 

就Stata而言,AK不是文字字符串,因此它只能是字符串变量的名称。但是你没有这样的变量,这就是你得到错误的原因。本来更合适的是

    if (state_nsw == "AK" & year == 2012) { local val_AK = income } 

或者更一般地说,

   if (state_nsw == "`i'" & year == 2012) { local val_`i'=income }

那么,为什么会收到错误invalid name r(198):

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

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

你的麻烦还没有结束。你的代码非常困惑。

将始终被解释为

    local val_`i' = income[1] 

无论if命令如何。

  • {8}之后{ }已经过时if放置在同一行,可能无法正常工作。

应该做些什么

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

虽然你想要这样做是一个难题。

答案 1 :(得分:2)

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

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