【问题标题】:Stata : generate/replace alternatives?Stata:生成/替换替代品?
【发布时间】:2015-09-11 10:44:46
【问题描述】:

我从几年前就开始使用 Stata 以及 R 等其他语言。 Stata 很棒,但有一点让我很恼火:生成/替换行为,尤其是“...已经定义”错误。

意思是如果我们要运行一段代码两次,如果这段代码包含一个变量的定义,这个定义需要2行:

capture drop foo
generate foo =  ...

而在 R 等其他语言中只需要一行代码。

那么还有另一种方法来定义在一个命令中结合“生成”和“替换”的变量吗?

【问题讨论】:

  • 在我看来,Stata 正在保护您数据的完整性。额外的支票是一笔不小的代价。
  • 这对我和其他人来说都不是问题,因为我将代码写在我从顶部运行的 do-files 中,首先是清除和重新加载数据。通过选择一组行并运行、编辑和重新运行直到它们正确,然后继续进行后续的一组行,我可以在调试时看到问题。但是因为这组行是从一个临时的 do 文件中运行的,所以在测试结束时不会保留本地宏以供下一组提交的行使用。这意味着我很少发现逐段提交代码很有用。
  • 是的,我同意 Stata 旨在运行整个 do-file 而不是 do-files,本地宏就是一个很好的例子,“set more off”命令也是如此。我想我应该调整我的行为。问题是某些命令执行时间很长,在执行完这些命令后调试代码并不方便。

标签: stata


【解决方案1】:

我不知道有任何方法可以直接执行此操作。此外,正如@Roberto 的评论所暗示的那样,简单地发出generate 命令不会覆盖(参见:replace)变量的内容是有原因的。

为了能够在保持数据完整性的同时做到这一点,您需要发出两个单独的命令,因为您的问题指出(在生成新变量之前明确删除现有变量) - 我认为这是 Stata 强制用户要清楚他/她的意图。

值得注意的是,Stata 在这方面并不孤单。例如,SQL Server 要求用户在创建同名表(在同一个数据库中)之前删除现有表,不允许在一个表中存在多个同名列等,所有这些都是有充分理由的。

但是,如果您真的打算在 Stata 中发布一个单行代码来做您想做的事情,您可以编写一个非常简单的程序。以下内容应该可以帮助您入门:

program mkvar
version 13

    syntax anything=exp [if] [in]

    capture confirm variable `anything'

    if !_rc {
        drop `anything'
        }   

   generate `anything' `exp' `if' `in'

end

然后您自然会将程序保存到 Stata 可以找到的目录中的 mkvar.ado(即 Windows 上的 C:\ado\personal\。如果您不确定,请键入 sysdir),并使用以下命令调用它:

mkvar newvar=expression [if] [in]

现在,我没有对上述代码进行太多测试,因此您可能需要进行一些调试,但在我尝试过的示例中它运行良好。

最后,我建议您在执行此操作时要小心 - 当然,您需要在更改数据时保持警惕,保留原始数据的副本,而 do 文件会处理内存中的数据等。

【讨论】:

  • 感谢您的回答。我没想过写程序,谢谢你的解释。当然,保留初始数据集的副本始终是一种好习惯。
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 2011-05-22
  • 2017-08-03
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
相关资源
最近更新 更多