我得到"名字无效"运行以下代码时
foreach i in 2008 2009 2010 2011{
disp `"Working in Year `i'"'
tostring `i', local(yearStr)
disp `"yearStr"'
graph bar E if Year=="'i'", c(1) name ('i',replace)
histogram E if Year=="`i'", c(1) name (`yearStr',replace)
}
我要做的是绘制年份和" E"之间的图表栏。从我已输入的数据集中选择2008 2009 2010 2011年。但每当我尝试运行代码时,都会发现相同的错误。
错误:
Working on year 2008
2008 invalid name
r(198);
答案 0 :(得分:1)
这里有几个错误和误解。
您的代码在tostring 2008
上失败,因为tostring
需要变量名称。 tostring
也不支持local()
选项,但Stata没有达到目标。但是,这里根本不需要字符串转换。宏是一个字符串。
您的代码可以重写为
forval i = 2008/2011 {
graph bar E if Year == "`i'", subtitle(`i') name(B`i', replace)
histogram E if Year == "`i'", subtitle(`i') name(H`i',replace)
}
出现的一些细节:
警告。为了实现这一点,Year
必须是一个字符串变量,这在其他地方听起来并不常用。 Year
会更好,就像数字一样。
语法。我将宏标点符号更正为不同的左右引号。
语法。我删除了选项c(1)
。你有什么期望呢?我知道没有这样的相关选择。也许您想要连接一行,c(l)
,除了这些命令无法使用。
样式。您的代码的意图似乎是采用宏i
的内容并将其放在另一个宏yearStr
中。没有必要这样做。
语法。 name()
更好地呈现没有空格,纯数字不能是合法的图形名称。
意图。与您的代码一样,宏i
和yearStr
将具有相同的内容,您偶然尝试(例如)创建名称为2008
的图形,然后覆盖它,如下一个图表所示有相同的名字。如上所述,语法在任何方面都是非法的,但只有不同的名称才有意义。
图表样式。最好将年份作为文本放在每个图表上,以解释每个图表显示的内容。
意图。第di "yearStr"
行只会显示文字yearStr
。它不会显示具有该名称的本地宏。 (我简化了复合双引号。)
所有这一切,用四年时间,你可能会更好用
graph bar E, by(Year)
histogram E, by(Year)
但是,如果每年只有E
的一个值,您可能需要更像
twoway bar E year, base(0)