如何分离Stata宏'varlist';在mi()和inlist()中使用逗号?

如何分离Stata宏'varlist';在mi()和inlist()中使用逗号?,stata,stata-macros,Stata,Stata Macros,我想在宏中存储变量列表,然后在mi()语句中调用该宏。最初的申请是针对一个使用我因保密原因无法在线提供的数据的程序,该程序将包括以下声明: generate u = cond(mi(`vars'),., runiform(0,1)) 问题在于mi()需要逗号分隔的变量名,但vars用空格分隔 我使用auto数据集和mark来说明我的问题: sysuse auto local myvars foreign price mark missing if mi(`myvars') 在本例中,mi()

我想在宏中存储变量列表,然后在
mi()
语句中调用该宏。最初的申请是针对一个使用我因保密原因无法在线提供的数据的程序,该程序将包括以下声明:

generate u = cond(mi(`vars'),., runiform(0,1))
问题在于
mi()
需要逗号分隔的变量名,但
vars
用空格分隔

我使用
auto
数据集和
mark
来说明我的问题:

sysuse auto
local myvars foreign price
mark missing if mi(`myvars')

在本例中,
mi()
请求用逗号分隔的参数,Stata停止并抱怨找不到
foreignprice
变量。是否有将在宏元素之间插入逗号的实用函数?

问题的直接答案是使用宏扩展函数
subinstr
将空格更改为逗号:

sysuse auto
local myvars foreign price
local myvars : subinstr local myvars " " ",", all 
mark missing if mi(`myvars')
如果目标是创建一个标记变量,用指定变量上缺少的任何值标记观测值,那么还有其他替代方法,其中大多数方法不需要在列表中使用分隔符。这并不是一整套

A1

A2

A3

A4

A5

编辑在编辑过的问题中,程序中引用了以下内容:

 generate u = cond(mi(`vars'),., runiform(0,1))
我不会这么做,即使宏也被编辑为包含逗号,尽管任何问题都更符合个人品味

 marksample touse 
 markout `vars' 
 generate u = runiform(0,1) if `touse' 

这样产生的指标变量很可能是需要的,或者至少是有用的,在同一个程序中的其他地方

嗨。那就行了。我以mark为例,因为它更容易操作,但我打算在程序中使用它作为条件,而不是使用mark。很好,但如果您真正的问题不同,您需要告诉我们它是什么。编辑问题以澄清预期的应用。
 local myvars foreign price 
 local myvars : subinstr local myvars " " ",", all 
 gen missing = missing(`myvars') 
 gen missing = 0 
 quietly foreach v in foreign price { 
     replace missing = 1 if missing(`v') 
 } 
 mark missing 
 markout missing foreign price 
 replace missing = !missing 
 generate u = cond(mi(`vars'),., runiform(0,1))
 marksample touse 
 markout `vars' 
 generate u = runiform(0,1) if `touse'