2017-03-06 130 views
0

我有两个变量message_one和message_two。添加一个对应于每个循环的循环变量的变量

在循环变量时,如果“vari”是varone,我想显示message_one,如果“vari”是vartwo,则显示message_two。

我想要做的是不同的,但这是一个例子。

我正在做以下事情,它不起作用。

foreach vari in varone vartwo { 

local suffix "one" if `vari'==varone 
local suffix "two" if `vari'==vartwo 

display(message_`suffix') 

} 

如何更改本地线路使其工作?

也就是说,我想添加一个对应于每个循环的循环变量的变量。

回答

1

if条件在这里不起作用。一般来说,它确定了满足某些条件的观测值。特别是,因为在将内容分配给宏时没有隐含的循环观察,所以这没有意义作为限定local。所以,你的语法可能会产生一个非法的语法消息(“不起作用”永远不是一个精确的问题报告)。

但是,注意,像

local foo if 2 == 2 

的效果仅仅是文本if 2 == 2复制到本地宏foo

你想要什么也许更像

foreach vari in varone vartwo { 
     di cond("`vari'" == "varone", "one", "two") 
} 

但这个循环是没有意义的单一直接表态足以:

di "one" _n "two" 

你可以这样做,而不是:

foreach vari in varone vartwo { 
     if "`vari'" == "varone" di "one" 
     else di "two" 
} 

这里的if命令与完全不同限定符。我不得不猜测你在这里想要什么。

首先,我在希望直接比较字符串的推测上添加了双引号。如果你想要别的东西,请解释一下。

其次,像

display(message_one) 

声明将工作当且仅当message_one是一个预定义的变量(在这种情况下,你会看到它的值显示在第一观察)或一个预定义的标量。但是,在一个变量存储单个文本消息是不必要的,尤其是如果相同的文字被用在了所有的观察,因为这将是与像

gen foo = "this message" 

在Stata不是定义标量的好方法。在程序中将一条消息定义为文本字符串几乎总是最简单最好的。

你问什么显然是你的真正问题的最小版本,但同样我不知道真正的问题是什么。