Разделение составной переменной на две переменные - PullRequest
0 голосов
/ 07 мая 2018

У меня есть переменная string с именем country, значением которой может быть, например, Afghanistan2008, но также может быть Brasil2012. Я хотел бы создать две новые переменные, одна из которых является частью страны, а другая частью года.

Поскольку в конце string всегда есть числа, я знаю позицию, в которой string должна быть разделена с правой стороны, но не с левой стороны.

Могу ли я использовать что-то вроде:

gen(substr("country",-4,.))

Если нет, может ли кто-нибудь сказать мне, как разбить целый столбец таких переменных на переменные country и year? Я также хотел бы сохранить исходную переменную.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы можете использовать регулярное выражение :

clear
set obs 2

generate string = ""
replace string = "Afghanistan2008" in 1
replace string = "Brasil2012" in 2

generate country = regexs(0) if regex(string, "[a-zA-Z]+")
generate year = regexs(1) + regexs(2) if regex(string, "(19|20)([0-9][0-9])")

list

   +--------------------------------------+
   |          string       country   year |
   |--------------------------------------|
1. | Afghanistan2008   Afghanistan   2008 |
2. |      Brasil2012        Brasil   2012 |
   +--------------------------------------+

Введите help regex в командной строке Stata для получения дополнительной информации.

В качестве альтернативы вы можете сделать следующее:

generate len = length(string) - 3

generate country2 = substr(string, 1, len - 1)
generate year2 = substr(string, len, .)

list country2 year2

   +---------------------+
   |    country2   year2 |
   |---------------------|
1. | Afghanistan    2008 |
2. |      Brasil    2012 |
   +---------------------+
0 голосов
/ 07 мая 2018

Для моей конкретной ситуации следующая переменная year создает:

gen spyear = real(substr(country,-4,.))

Я взял другую часть из @PearlySpencer:

generate len = length(country) - 3
generate spcountry = substr(country, 1, len - 1)

, который создает лишний столбец для удаления.

РЕДАКТИРОВАТЬ (Ник Кокс) Это может быть упрощено до

gen spyear = real(substr(country, -4, 4)) 
gen spcountry = substr(country, 1, length(country) - 4)

показывает, что

  1. Нет необходимости создавать переменную, содержащую длину строки.

  2. Головоломка 4 = 3 + 1 также не нужна.

...