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

Save list of distinct values of a variable in another variable

我有 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

我认为根据您的输入,您想要的输出可能存在一些问题,但除此之外应该可以这样做:

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 的观测值,然后 collapses 为每个国家年获取一行。

这是另一种方法,也许更直接。如果 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 |
     +-------------------------+