如何基于两个字符串变量生成匹配时取值为1的虚拟变量?
解决Stata中空格分隔字符串的匹配问题
针对你遇到的两个空格分隔语言字符串变量的匹配需求,以下是两种可行的解决方法:
方法一:正则表达式直接匹配
利用Stata的regexm()函数,结合单词边界(\y)确保匹配完整的语言代码,避免部分匹配(比如误将apca识别为包含apc):
* 初始化虚拟变量为0 gen match = 0 * 当var1中包含var2的完整语言代码时,设为1 replace match = 1 if regexm(var1, "\y" + var2 + "\y")
如果var2中也包含多个空格分隔的语言(比如apc fra),可以调整为循环检查每个语言:
gen match = 0 quietly forvalues i = 1/`=_N' { local lang_list = var2[`i'] tokenize "`lang_list'" foreach lang in `*' { if regexm(var1[`i'], "\y`lang'\y") { replace match = 1 in `i' continue, break // 找到匹配后跳出循环,提升效率 } } }
方法二:拆分变量后匹配
如果正则表达式的方式你觉得不够直观,可以先将两个变量拆分为单个语言的变量,再手动匹配:
* 拆分var1为多个临时变量 split var1, parse(" ") gen(lang1_) * 拆分var2为多个临时变量 split var2, parse(" ") gen(lang2_) * 初始化虚拟变量 gen match = 0 * 循环检查所有拆分后的语言对 forvalues i = 1/`c(k)' { forvalues j = 1/`c(k)' { replace match = 1 if lang1_`i' == lang2_`j' & !missing(lang1_`i') & !missing(lang2_`j') } } * 可选:删除拆分后的临时变量 drop lang1_* lang2_*
为什么fndmtch2或egen anymatch失效?
这两个命令主要针对数值型变量组或结构化的列表变量(比如egen group生成的分类变量),而你用egen concat生成的是空格分隔的字符串变量,不属于它们的处理范畴,因此无法正确识别匹配项。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

