Stata 提取与变量匹配的字符串中的术语

Stata 提取与变量匹配的字符串中的术语,stata,Stata,我有一个包含两个字符串变量的大型数据集:people\u attendent和special\u attendee: *Example generated by -dataex-. To install: ssc install dataex clear input str148 people_attending str16 special_attendee "; steve_jobs-apple_CEO; kevin_james-comedian; michael_crabtree-footb

我有一个包含两个字符串变量的大型数据集:
people\u attendent
special\u attendee

*Example generated by -dataex-. To install: ssc install dataex
clear
input str148 people_attending str16 special_attendee
"; steve_jobs-apple_CEO; kevin_james-comedian; michael_crabtree-football_player; sharon_stone-actor; bill_gates-microsoft_CEO; kevin_nunes-politician" "michael_crabtree"
"; rob_lowe-actor; ted_cruz-politician; niki_minaj-music_artist; lindsey_whalen-basketball_coach"                                                      "niki_minaj"      
end
第一个变量的长度各不相同,包含参加活动的每个人的列表以及他们的头衔。姓名和标题用破折号分隔,与会者用分号和空格分隔。第二个变量与第一个变量中包含的一个名称完全匹配


我想创建第三个变量,为第二个变量中列出的任何人提取标题。在上面的示例中,我希望新变量为“football\u player”用于观察
1
,而“music\u artist”用于观察
2

以下是一种使用简单正则表达式执行此操作的方法:

generate wanted = subinstr(people_attending, special_attendee, ">", .)
replace wanted = ustrregexs(0) if ustrregexm(wanted, ">(.*?);")
replace wanted = substr(wanted, 3, strpos(wanted, ";")-3)

list wanted

     +-----------------+
     |          wanted |
     |-----------------|
  1. | football_player |
  2. |    music_artist |
     +-----------------+
在第一步中,用标记替换名称。然后使用正则表达式提取相关的子字符串。在最后一步中,您将进行清理


编辑:

如果您稍微修改代码,则可以省略第三步,如下所示:

generate wanted = subinstr(people_attending, special_attendee, ">", .)
replace wanted = ustrregexs(1) if ustrregexm(wanted, ">-(.*?);")
也张贴在这是一个好主意,告诉每个社区关于其他帖子。不这样做通常被认为是不礼貌的。