我有很多变数。为简洁起见,假设我有两个:Gender
和Meal
。在Stata中,我正在使用tabout
,这是一个允许根据Stata结果生成.tex
的包,可以在LaTeX中作为表打开。
为了在变量标签之前创建一个间距较小的自定义输出,我想在每个变量的所有值(而不是标签)的开头分配一个前缀\hspace{0.3cm}
。如何使用循环自动执行此操作而不是手动执行此操作?
我们说我从这开始:
label def gen 0 "Male" 1 "Female", modify
label value Gender gen
label def me 0 "Lunch" 1 "Dinner", modify
label value Meal me
我希望有一个循环,会自动将前缀添加到Gender
和Meal
的各个值中。最终结果与我最初的结果相同:
label def gen 0 "\hspace{0.3cm}Male" 1 "\hspace{0.3cm}Female", modify
label value Gender gen
label def me 0 "\hspace{0.3cm}Lunch" 1 "\hspace{0.3cm}Dinner", modify
label value Meal me
请注意,代码(来自http://www.jwe.cc/2012/03/stata-latex-tables-estout/)对变量标签(和NOT值)执行类似的操作如下:
foreach v of varlist * {
label variable `v' `"\hspace{0.1cm} `: variable label `v''"'
}
答案 0 :(得分:3)
以下是一些产生所需字符串的代码。我留给你定义新的值标签并分配给变量。如果它有用,请告诉我们。
clear all
set more off
*----- example -----
label def gen 0 "Male" 1 "Female", modify
*label value Gender gen
label def meal 0 "Lunch" 1 "Dinner", modify
*label value Meal me
*----- what you want -----
label dir
local rnames `=r(names)'
foreach labname of local rnames {
quietly label list `labname'
local myname
forvalues i = 0/`r(max)' {
local name : label `labname' `i', strict
local newname \hspace{0.3cm}`name'
local myname `myname' `newname'
}
display "`myname'"
}
你可以缩短一点,但这一切都非常“明确”。
help label
和help extended_fcn
是必读的。
(我仍然坚持认为tabout
内的解决方案可能可能;但我无法确定。)
以下是更一般的,有更好的形式,是一个完整的例子。 扩展宏函数仍然是代码的基础。
clear all
set more off
*----- example database -----
sysuse voter
*----- what you want -----
foreach var of varlist _all {
local cnewname
quietly labellist `var'
if "`r(lblname)'" != "" {
*disp "`var'"
forvalues i = 1/`r(`r(lblname)'_k)' {
local val : word `i' of `r(values)'
local labval : word `i' of `r(labels)'
local newname `val' "\hspace{0.3cm}`labval'"
local cnewname `cnewname' `newname'
} // forvalues
label define newlbl`var' `cnewname'
label value `var' newlbl`var'
} // if
} // foreach
labellist
我定义新的值标签并重新关联相应的变量。您可以尝试更换或满足您的需求。
答案 1 :(得分:2)
Stata不了解TeX或LaTeX,至少不是这样。
你可以只用空格加前缀,但Stata通常会以任何方式忽略它们。
我偶尔使用的一个奇怪的技巧是使用char(160)
作为一个看起来像空间但不会被修剪的垫。
length(trim("`=char(160)'"))
报告为1,即未调整char(160)
。要检查您的计算机上是否隐身char(160)
,
di char(160)
但是这如何运作肯定取决于你的TeX / LaTeX代码以及它如何处理这个角色。