前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STATA Tidbits:Macro Extended Functions

STATA Tidbits:Macro Extended Functions

作者头像
宋彦
发布2019-07-03 16:58:22
1.4K0
发布2019-07-03 16:58:22
举报
文章被收录于专栏:一点ECON一点ECON

前言

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

Macro Extended Functions

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

处理平行列表( word i of)

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

代码语言:javascript
复制
sysuse auto,clear

sum make        if rep78 > 0

sum gear_ratio  if rep78 > 2

sum mpg         if rep78 > 5

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

代码语言:javascript
复制
local thresholdlist "0 2 5"
local varlist "make gear_ratio mpg"

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

代码语言:javascript
复制
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,用来提取变量的标签。该函数的应用场景非常广泛,我们举一个例子说明。假设有如下数据

该数据由以下代码生成

代码语言:javascript
复制
ssc install dataex

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

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

代码语言:javascript
复制
tab product,gen(productID)

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

代码语言:javascript
复制
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即可达到用产品名来命名变量的目的。

最后的效果如图:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一点ECON 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • Macro Extended Functions
      • 处理平行列表( word i of)
      • 处理画图或者制表时的提取变量标签 varlabel
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档