问题标签 [stata-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1482 浏览

stata - 如何遍历变量名的一部分?

我需要使用本地宏来遍历 Stata 中变量名的一部分。

这是我试图做的:

Stata 不会识别整个变量名。

如果我在“phth”之后删除下划线,它仍然无法识别宏名称之后的任何内容。

我想避免使用复杂的foreach循环。

有什么方法可以只使用简单的宏来完成吗?谢谢!

0 投票
1 回答
186 浏览

stata - Stata宏读取所有数据

我有以下do文件:

我有每月的数据,我可以运行这个程序来dta为每年的每个月创建文件。

但是,我每个月和每年都有几个原始数据。例如,我可以为 2010 年到2012 年的, , , ... 运行此do文件。我要为每个月获取一个文件,我必须在每次需要时更改它以用于不同的月份。JanFebMarchAprilAprildta

我想知道如何通过某种宏来实现这一点?

某种代码在代码周围添加循环,引用与该文件对应的每月文件的do文件名。

0 投票
1 回答
445 浏览

stata - 如何标记扩展宏(本地 :dir )?

我知道我的标题在tokenize命令被指定为字符串的意义上令人困惑。

我有许多文件夹,其中包含大量、分离、名称错误的 Excel 文件(其中大部分是从 ahe 网站上抓取的)。手动选择不方便,需要依靠Stata扩展宏功能local :dir来读取。

我的代码如下所示:

这样的代码将生成许多新dta文件,因此目录中充满了这些文件。我更喜欢为第一个文件创建一个新的数据文件xlsx,然后appendforeach循环内创建其他文件。所以本质上,有一个if-else内部循环。

我们需要一个filelist 刚刚创建的宏的索引,这样我们就可以编写如下内容:

我知道我的代码效率低下且容易出错:表达式的语法token 'filelist'也不正确(假设它filelist不是字符串)。但是,我仍然想弄清楚我的伪代码背后的基本结构。

我怎样才能更正我的代码并使其工作?

另一种更有效的方法受到高度欢迎。

0 投票
2 回答
566 浏览

stata - 如何获取子目录的完整列表(包括子目录的子目录)?

我有数千个城市文件夹(例如city1,city2等,但实际上命名为NewYork,Boston等)。每个文件夹还包含两个子文件夹:landhouse.

所以目录结构是这样的:

我想获取所有子目录的完整列表并进行一些操作(例如import excel)。我知道有一个宏扩展函数:local list: dir来处理这个问题,但它似乎只能返回first tier子目录,比如city_i,而不是那些更深的。

更具体地说,如果我想在所有内部文件夹中采取行动,我需要什么样的工作流程?

我已经初步尝试编写代码来实现我的目标:

有问题:

无论如何,在目录中,我努力让它工作但没有成功。

我有另一个关于这个项目的帖子。


补充说明:

正如尼克指出的那样,引起麻烦的是反斜杠。然而,从那一点开始,我遇到了另一个问题。说,没有复杂的动作,我只想测试我的循环是否有效,所以我编写了以下代码片段:

然而,屏幕上的结果是这样的:

似乎代码只在第一个城市上循环了一轮,但未能到达city2city3依此类推。我怀疑这是由于我在当地的写作有问题,尤其是在这一行,但我不确定:

0 投票
4 回答
1273 浏览

regex - 使用正则表达式或 subinstr() 清理本地宏

我的目标是清除给定的本地_数字和单词末尾下划线后面的所有数字。假设我只有在单词末尾有下划​​线和数字。

通过使用subinstr(),我可以指定要消除_1(并且可能循环不同的数字),但是对于此类任务,双循环语法似乎过于复杂:

我试图研究regexm()and regexs(),但我不太确定如何设置代码。

我知道可能有多种方法可以解决这个问题。

也许有一种更简单的方法来解决我看不到的问题?

0 投票
1 回答
1059 浏览

stata - 如何自动将最大数量的字符串分配给宏?

我的问题的标题可能有点模棱两可。

以前,我想“获取完整的子目录列表”,然后将这些子目录中的文件读入 Stata(参见这篇文章这篇文章)。

感谢@Roberto Ferrer 的好建议,我几乎做到了。但那时我遇到了另一个问题。因为我有这么多单独的文件,本地宏的长度似乎达到了上限。命令local n: word countStata发送错误消息后:

宏替换导致行太长。

替换宏产生的行将比允许的长。最大允许长度为 645,216 个字符,根据 set maxvar 计算得出。您可以在 Stata/SE 和 Stata/MP 中更改它。以下内容仅在您使用 Stata/SE 或 Stata/MP 时相关。

最大行长度定义为比最大宏长度大 16,目前为 645,200 个字符。set maxvar 每增加一个单位,长度最大值就会增加 129。set maxvar 的最大值为 32,767。因此,如果将 maxvar 设置为其最大值,则最大行长度可能设置为 4,227,159 个字符。

r(920);

当我将子目录的数量减少到 5 个时,Stata 工作正常。由于大约有 100 个子目录,我想复制这些操作 20 次。好吧,它是可以管理的,但我还是想知道我是否可以完全自动化这个过程,更具体地说,“用尽”最大允许的宏长度,导入文件并下次添加另一组子目录。

您可以在下面找到我的代码:

谢谢你。

0 投票
1 回答
59 浏览

if-statement - 局部宏的使用

我想从我的原始数据中写入六个临时数据文件,保留以下变量:

  • 温度 1:v1-v18
  • 温度 2:v1-v5 v19-v31
  • 温度 3:v1-v5 v32-v44
  • temp4:v1-v5 v45-v57
  • temp5:v1-v5 v58-v70
  • 温度 6:v1-v5 v71-v84

我尝试了以下方法:

我得到一个invalid syntax错误。问题在于keep陈述。具体来说,if本地宏的条件似乎违反了语法规则。

0 投票
1 回答
52 浏览

indexing - 在索引中使用宏循环时出错

我正在尝试创建一个虚拟变量来识别选择截止后的下五个观察值。下面代码中的第一种方法有效,但它看起来有点乱,我希望能够调整我创建假人的观察次数,而无需输入相同的表达式 30 次(通常是我的标志以艰难的方式做某事)。

每次我将宏放入索引时,即

我收到以下错误:

我会非常感谢一些建议。

这有效

这没有。

关于为什么的任何建议?

0 投票
2 回答
77 浏览

loops - 生成一个新的宏前缀旧宏的词

定义一个宏try

这将生成一个值为 的宏a b c

现在我想要一个新的宏try2来接受 value da db dc。也就是说,我想为旧宏的每个元素添加相同的前缀,并将其定义为新宏。

0 投票
2 回答
1912 浏览

loops - Looping over variables with wildcards in local macros

Suppose I have a dataset of variables with the following names (note the stub of x and hm):

I want to develop a programmatic way to provide a list of variable names (which may contain wildcards) and then loop through each variable name to recode all values less than 0 with a missing value (.).

In practice I have many columns and only want to recode some of them. I do not want to use column index or ranges because I do not know them, since my data are large.

My approach involves the following steps:

  1. Create a local macro named myvars containing the variable names with wildcards

    /li>
  2. Expand the strings in the variable list to contain the full variable name strings (this should produce the original variable names):

    /li>
  3. Loop through list of variable names to set values to missing:

    /li>

However, I can't figure out how to include the wildcards in the for loop. The above code does not work and produces invalid syntax errors.

I found the following threads on Statalist useful, but they do not provide a solution and the use of stubs does not seem efficient:

Can anyone help me?