如何从宏为 Stata 中的变量提供标签

How can I give labels to variables in Stata from macro

本文关键字:变量 标签 Stata      更新时间:2023-10-16

我想用插件创建变量,导入数据库表。我使用以下代码来执行此操作:

SF_macro_save("_vars", "var1 var2...");
SF_macro_save("_types", "type1 type2...");
SF_macro_save("_formats", "format1 format2...");
SF_macro_save("_obs", "obs1 obs2...");

这很好地创建了变量,但我不知道如何为变量或值提供标签。

我需要使用哪个C++函数来创建标签?或者如何从C++调用 Stata 函数?(如果它很重要,我正在使用Visual Studio 10)

我想从插件调用这个 Stata 函数:

标签

变量 var1 标签1

标签定义 var1_label 1 "标签1" 2 "标签2" 标签值 var1 var1_label

谢谢

这是可能的,但并不容易。 基本上,在代码中创建一个 .do 文件(下面的 C# 示例),然后执行 .do 文件。 下面是一个运行 .do 文件,然后使用 ODBC 将结果放入 SQL Server 数据库中的示例。 您可以使用统计/传输执行类似的操作,将数据和变量标签加载到数据库中。

            string m_stcmd_valuelabels = Server.MapPath("~/Data/Cmd/Stata/") + m_filename_noex + "_valuelables.do";
            using (StreamWriter m_sw_stcmd_valuelabels = new StreamWriter(m_stcmd_valuelabels, false))
            {
                m_sw_stcmd_valuelabels.WriteLine("clear");
                m_sw_stcmd_valuelabels.WriteLine("set mem 500m");
                m_sw_stcmd_valuelabels.WriteLine("set more off");
                m_sw_stcmd_valuelabels.WriteLine("use  "" + m_fullpath.Replace(".zip", ".dta") + """);
                m_sw_stcmd_valuelabels.WriteLine("valtovar _all, dis");
                m_sw_stcmd_valuelabels.WriteLine("uselabel");
                m_sw_stcmd_valuelabels.WriteLine("ren lname varname");
                m_sw_stcmd_valuelabels.WriteLine("drop trunc");
                m_sw_stcmd_valuelabels.WriteLine("odbc insert, dsn("MyData") table("" + m_filename_noex + "_valuelabels") create " + m_statadsn_conn);
                m_sw_stcmd_valuelabels.WriteLine("exit");
                m_sw_stcmd_valuelabels.WriteLine();
            }
            string str_PathValueLabels = Server.MapPath("~/Data/Stata12/StataMP-64.exe");
            ProcessStartInfo processInfoValueLabels = new ProcessStartInfo(""" + str_PathValueLabels + """);
            processInfoValueLabels.Arguments = " /e do "" + m_stcmd_valuelabels + """;
            processInfoValueLabels.UseShellExecute = false;
            processInfoValueLabels.ErrorDialog = false;
            Process batchProcessValueLabels = new Process();
            batchProcessValueLabels.StartInfo = processInfoValueLabels;
            batchProcessValueLabels.Start();

你不能从插件中做到这一点。您不能创建变量、标签。等。。从 DLL 中,必须在调用插件之前定义数据集,您可能已经知道。您可以将数据值存储回变量中,但如果您愿意,则无需添加"列"。您可以将所需的名称存储在宏中,但抱歉,将它们分配给 Stata 中的变量将落在您的".do"文件上。