STATA Tidbits:Macro Extended Functions

前言

宏(Macro)是STATA程序中很重要的概念,主要用来在循环语句中对一系列变量名称或者数字进行替代,从而减少机械重复。在这些基础用法之外,STATA提供了一些宏的函数,来增强宏的功能。本文将对其中两类宏函数进行举例介绍。

Macro Extended Functions

所有宏函数的语法格式是一致的: localmacro:function,即在定义好宏的名字之后的冒号后使用函数。下面我们具体介绍两类函数,一类是 word i of,用来处理平行列表,一类是 varlabel,用来提取变量标签。

处理平行列表( word i of)

我们处理数据时会遇到需要使用两列平行的变量的情况。用STATA的auto.dta来举例,我们需要对不同变量进行tabulate,而每组变量的限制条件也不相同:

sysuse auto,clear

sum make        if rep78 > 0

sum gear_ratio  if rep78 > 2

sum mpg         if rep78 > 5

当每列变量从三个增加到三十个甚至更多时,上述代码就会变得异常臃肿。这时,平行列表结合宏函数 word i of可以简洁的解决这个问题。平行列表即是两个宏变量:

local thresholdlist "0 2 5"
local varlist "make gear_ratio mpg"

word i of函数可以选取一个列表中的第 i个值,该值可以是数字或者文字。将平行列表和 word i of函数结合之后,我们就可以轻松的处理任意数量的该类型问题。

sysuse auto,clear

local thresholdlist "0 2 5"
local varlist "headroom gear_ratio mpg"

local numitems = wordcount("`thresholdlist'")

forvalues i=1/`numitems' {
    local thisthreshold : word `i' of `thresholdlist'
    local thisvar : word `i' of `varlist'
    di "variable: `thisvar', threshold: `thisthreshold'"
    sum `thisvar'  if rep78 > `thisthreshold'
}

处理画图或者制表时的提取变量标签 varlabel

第二种函数是 varlabel,用来提取变量的标签。该函数的应用场景非常广泛,我们举一个例子说明。假设有如下数据

该数据由以下代码生成

ssc install dataex

clear
input companyid str10 product
1 "P2P"
2 "Retail"
3 "Commercial"
4 "CreditCard"
5 "CreditCard"
6 "EMFunds"
end

当我们希望生成一个代表产品的时,我们可以输入:

tab product,gen(productID)

问题来了,上述代码生成的变量名称是productID1,productID2等,如果我们希望用产品的内容来命名每个变量该如何实现呢?下面我们介绍一种使用 varlabel函数来实现的方法,具体代码如下:

ds product_id*

foreach var of varlist `r(varlist)' {
    local varlabel: variable label `var'
    display "`varlabel'"
    local pos = strpos("`varlabel'","==")+2
    local varlabel = substr("`varlabel'",`pos',.)
    display "`varlabel'"
    rename `var' `varlabel'
}

具体来说:

  1. 第一行的 ds product_id 是把所有刚才生成的产品变量名称放到一个叫做 r(varlist)的宏里,用于下面语句的循环。
  2. 第二行的 foreach var of varlist r(varlist) 用来循环每一个产品变量。
  3. 第三行就用到了 variable lable 函数来提取每个产品变量的label,例如productID1变量的label是 product==P2P。这样,我们就可以把"product==P2P"提取到一个名为 varlabel的宏中
  4. 第五,六行使用 strpossubstr函数来提取label中我们需要的部分,例如对productID1,我们只需要"P2P"字符。
  5. 最后,使用rename即可达到用产品名来命名变量的目的。

最后的效果如图:

本文分享自微信公众号 - 一点ECON(little_econ)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余林丰

【好书推荐】《剑指Offer》之硬技能(编程题7~11)

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。例如:输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, ...

8920
来自专栏小詹同学

支持中文的算法可视化网站,你想要的算法这都有

上次文摘菌给大家推荐了一个能让算法动起来的开源项目之后,有热心的读者给文摘菌推荐了另一个算法可视化的网站。文摘菌打开之后,立即被起画风所折服,所以决定探索一番。

7810
来自专栏机器之心

吴恩达的Drive.ai或将被苹果收购,苹果做自动驾驶信念愈加坚定

2019 年 3 月 4 日,正是 Drive.ai 被爆出迫切寻求买家的时间点。

10430
来自专栏智能算法

当医学医疗遇上了人工智能,抠图算法应用的又一力作

目前的医学实践中,血管分割技术在眼底图像分析与计算机辅助眼病诊断中扮演着举足轻重的角色,它是医疗诊断、手术辅助设计的基础,且对早期发现和治疗不同的心血管病和眼部...

22110
来自专栏AI科技大本营的专栏

算法能拯救烂片吗?好莱坞正用AI决定拍什么样电影

电影世界充满了耐人寻味的事情。众所周知,Will Smith 拒绝出演 The Matrix 中的 Neo 一角,而 Nicolas Cage 作为 Tim B...

7220
来自专栏机器之心

2019高考编程卷:谷歌面试编程题及解题技巧(MIT版)

本课程重点介绍科技公司在面试时经常出现的计算机科学问题,其中包括时间复杂度、哈希表、二进制树搜索,以及 MIT「算法设计与分析」(MIT 6.046)课程中会出...

15210
来自专栏机器之心

百倍提升张量计算:谷歌开源TensorNetwork

TensorNetwork 链接:https://github.com/google/tensornetwork

8420
来自专栏AI科技大本营的专栏

从流感预测到智能决策,深度学习能帮企业做哪些事?

这句话大概可以总结两层意思,一方面人工智能让更多的企业面对更广阔的商业前景,另一方面是如果要运用人工智能创造价值,就必须拥抱技术,实现真正的落地。

10720
来自专栏机器之心

机器人见多了,你见过机器船吗?MIT新版ROBOAT可以自动组装

论文链接:http://www.particlerobots.com/luismateos/publications/LuisAMateos_ICRA2019_...

11610
来自专栏深度学习自然语言处理

斯坦福经典AI课程CS 221官方笔记来了!机器学习模型、贝叶斯网络等重点速查

斯坦福大学的人工智能课程“CS 221”,这门铁打的课程从2011年开始已经走过了8个年头,流水的讲师换了一批又一批,送走的毕业生一拨又一拨,至今仍然是人工智能...

17230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励