将变量的不同值列表保存在另一个变量中

时间:2016-05-06 20:03:50

标签: stata distinct-values

我的数据位于country - year - z级别,其中z是一个分类变量,可以采用(比方说)10个不同的值(针对每个国家/地区) -年)。 country - year - z的每个组合在数据集中都是唯一的。

我想在国家/地区级别获取一个数据集,其中包含所有不同值z的新(字符串)变量。

例如,让我说我有以下数据:

country     year    z
A           2000    1
A           2001    1
A           2001    2
A           2001    4
A           2002    2
A           2002    5
B           2001    7
B           2001    8
B           2002    4
B           2002    5
B           2002    9
B           2003    3
B           2003    4
B           2005    1

我想获得以下数据:

country     year    z_distinct
A           2000    1
A           2001    1 2
A           2002    2 5
B           2001    7 8
B           2002    4 5 9
B           2003    3 4
B           2003    4

2 个答案:

答案 0 :(得分:3)

我认为根据您的输入,您所需的输出可能会出现一些问题,但除此之外应该这样做:

clear

input str1 country     year    z
"A"           2000    1
"A"           2001    1
"A"           2001    2
"A"           2001    4
"A"           2002    2
"A"           2002    5
"B"           2001    7
"B"           2001    8
"B"           2002    4
"B"           2002    5
"B"           2002    9
"B"           2003    3
"B"           2003    4
"B"           2005    1
end

gen z_distinct = "";
egen c_x_y  = group(country year)

levelsof c_x_y, local(pairs)

foreach p of local pairs {
    qui levelsof z if c_x_y == `p', clean separate(" ")
    qui replace z_distinct = "`r(levels)'" if c_x_y==`p'
}

collapse (first) z_distinct, by(country year)

sort country year

代码循环遍历国家/年,使用levelsof计算z的观察值,然后collapse s为每个国家/年计算一行。

答案 1 :(得分:3)

这是另一种方法,也许更直接。如果z已经是字符串变量,那么string()调用都应该被省略。

clear 
input str1 country year z
A 2000 1
A 2001 1
A 2001 2
A 2001 4
A 2002 2
A 2002 5
B 2001 7
B 2001 8
B 2002 4
B 2002 5
B 2002 9
B 2003 3
B 2003 4
B 2005 1
end 

bysort country year (z) : gen values = string(z[1]) 
by country year : replace values = values[_n-1] + " " + string(z) if z != z[_n-1] & _n > 1 
by country year : keep if _n == _N 
drop z 

list , sepby(country) 
     +-------------------------+
     | country   year   values |
     |-------------------------|
  1. |       A   2000        1 |
  2. |       A   2001    1 2 4 |
  3. |       A   2002      2 5 |
     |-------------------------|
  4. |       B   2001      7 8 |
  5. |       B   2002    4 5 9 |
  6. |       B   2003      3 4 |
  7. |       B   2005        1 |
     +-------------------------+