0

我有一个string名为的变量country,其值可以是例如Afghanistan2008,但也可以是Brasil2012。我想创建两个新变量,一个是国家部分,一个是年份部分。

因为 的末尾总是有数字,所以string我知道string应该从右侧而不是从左侧拆分的位置。

我可以使用类似的东西:

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

如果没有,谁能告诉我如何将一整列这样的变量拆分为一个变量country和一个year变量?我也想保留原始变量。

4

2 回答 2

2

您可以使用正则表达式

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 regexStata 的命令提示符以获取更多信息。

或者,您可以执行以下操作:

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 |
   +---------------------+
于 2018-05-07T15:20:47.563 回答
1

对于我的具体情况,以下创建了一个新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。

于 2018-05-07T15:10:04.670 回答