Извлечь термин в строке, которая соответствует переменной - PullRequest
1 голос
/ 13 февраля 2020

У меня большой набор данных с двумя строковыми переменными: people_attending и special_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

Первая переменная отличается по длине и содержит список каждого человека, который посетил мероприятие вместе с их заглавие. Имя и заголовок разделяются знаком da sh, а участники разделяются точкой с запятой и пробелом. Вторая переменная является точным совпадением одного из имен, содержащихся в первой переменной.

Я хочу создать третью переменную, которая извлекает заголовок для любого человека, перечисленного во второй переменной. В приведенном выше примере я хотел бы, чтобы новая переменная была «football_player» для наблюдения 1 и «music_artist» для наблюдения 2.

1 Ответ

1 голос
/ 13 февраля 2020

Вот способ сделать это с помощью простого регулярного выражения:

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, ">-(.*?);")
...