Stata中提取所有匹配正则的字符串生成新变量的技术咨询
Stata实现:匹配指定子串并拼接至原字符串末尾
刚好碰到过类似的需求,给你整理了一个清晰的实现方法,一步步来:
首先先把你的原始数据代码放出来,方便复现:
clear input str18 string "abc bcd cde" "def efg fgh" "ghi hij ijk" end
你之前用regexm()只能判断是否存在匹配,但现在需要把原字符串和所有匹配到的abc、cde、def子串拼接起来,生成wanted变量。这里用循环结合strpos()的方法最直观,也方便后续修改匹配的子串列表:
* 初始化wanted变量为原字符串 gen wanted = string * 定义需要匹配的目标子串列表,可按需添加或修改 local target_substrings "abc cde def" * 循环遍历每个子串,匹配到就追加到wanted末尾 foreach sub in `target_substrings' { * strpos()判断原字符串是否包含当前子串,存在则拼接 replace wanted = wanted + " " + "`sub'" if strpos(string, "`sub'") } * 查看结果 list
运行这段代码后,就能得到你想要的输出结果:
| string | wanted |
|---|---|
| abc bcd cde | abc bcd cde abc cde |
| def efg fgh | def efg fgh def |
| ghi hij ijk | ghi hij ijk |
小说明:
- 用
local定义子串列表的好处是,后续如果要增加或修改匹配的子串,只需要修改这一行即可,不用改动循环逻辑。 strpos()函数会返回子串在原字符串中的起始位置,如果返回0就表示不存在,这里用它做判断比regexm()更简单直接,当然你也可以换成regexm(string, "sub'")`来做判断,效果是一样的。
内容的提问来源于stack exchange,提问作者b_surial
相关产品推荐
相关产品推荐

