我想在宏中保存.dta数据集中变量的存储类型(不打开它)。
作为示例,我将首先创建一个数据集temp.dta
drop _all
set obs 100
gen a = runiform()
save temp, replace
在交互式会话中,我可以使用命令describe using
但是,该命令仅保存数据集的维度,而不包含与存储类型相关的任何信息。
有办法吗?
答案 0 :(得分:1)
您可以从这个例子开始:
clear
set more off
sysuse auto
foreach v of varlist _all {
local allt `allt' `v' `: type `v''
}
display "`allt'"
我设置信息,使每个变量名称后跟类型,但您可以修改它以满足您的需要;也许是两个本地人,一个是变量名,另一个是相应的类型,最适合你。
关键是扩展宏功能 type varname
。有关详细信息,请参阅help extended_fcn
。
为此,需要在某个时刻打开数据集。如果没有后一种要求,我不知道这样做的方法。
@SteveSamuels建议use <somedata> in 1
,我提出基准测试:
clear
*----- example data -----
sysuse auto
expand 50000
tempfile myauto
save "`myauto'"
*----- tests -----
clear
timer on 1
describe using "`myauto'"
timer off 1
clear
timer on 2
use "`myauto'" in 1
describe
timer off 2
clear
timer on 3
use "`myauto'"
describe
timer off 3
count
timer list
timer clear
clear
导致
. timer list
1: 0.00 / 1 = 0.0000
2: 0.22 / 1 = 0.2190
3: 0.33 / 1 = 0.3260
因此,正如预期的那样,它比简单的use
快,但describe using ...
仍然赢得比赛。后者必须使用优化代码,此外,use <somedata> in 1
必须有一些原因意外地缓慢,尽管只加载一个观察。
当然,这不包括循环变量和使用扩展宏函数,也不包括解析日志文件;但我认为结果不会被修改过多。