如何将Stata宏`varlist'转为逗号分隔格式适配mi()与inlist()?
解决Stata宏变量空格分隔适配mi()函数的问题
我来帮你搞定这个Stata里的小麻烦!你遇到的核心问题就是:mi()函数要求变量名以逗号分隔,但你的宏里是空格分隔的变量列表,直接代入会触发语法错误。下面用auto数据集一步步演示解决方案:
先重现问题
先写一段能复现错误的代码,你一看就懂:
sysuse auto, clear * 定义空格分隔的变量宏 local myvars foreign price mpg weight * 直接代入mi()会报错! generate u = cond(mi(`myvars'), ., runiform(0,1))
这段代码会报错,因为Stata把mi(foreign price mpg weight)解读成给mi()传了foreign作为第一个参数,剩下的price等都是多余参数,不符合mi()的语法要求。
解决方案:把空格分隔转成逗号分隔
我们只需要把宏里的空格替换成逗号就行,有两种常用方式:
方式一:重新定义一个逗号分隔的宏
先处理宏内容,生成一个新的逗号分隔宏,再代入mi():
sysuse auto, clear local myvars foreign price mpg weight * 把空格替换成逗号,strtrim处理掉首尾/多余空格 local myvars_comma = subinstr(strtrim("`myvars'"), " ", ",", .) * 现在可以正常调用mi()了 generate u = cond(mi(`myvars_comma'), ., runiform(0,1))
这里strtrim()是为了避免宏里可能存在的首尾空格或连续空格,确保替换后的逗号都是分隔变量用的,不会出现多余逗号。
方式二:直接在调用时处理(无需额外宏)
如果不想多定义一个宏,也可以直接在mi()里做字符串替换:
sysuse auto, clear local myvars foreign price mpg weight * 直接在mi()内部完成空格转逗号的转换 generate u = cond(mi(`=subinstr(strtrim("`myvars'"), " ", ",", .)'), ., runiform(0,1))
这里的=是告诉Stata先执行后面的字符串替换命令,再把结果代入mi()。
额外说明
如果你的宏里本身就包含逗号(虽然这种情况很少见),那就要换别的分隔符,但一般变量名里不会有逗号,所以上面的方法完全够用。
内容的提问来源于stack exchange,提问作者Kenji
相关产品推荐
相关产品推荐

