2016-05-06 6 views
0

У меня есть данные по состоянию на country - уровне z, где z является категориальным переменным, которая может принимать (скажет) 10 различных значений (для каждой страны-года) - year. Каждая комбинация country - year - z уникальна в наборе данных.Сохранить список различных значений переменного в других переменных

Я хотел бы получить набор данных на уровне country-year с новой (строковой) переменной, содержащей все различные значения 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 
+0

Как @Dimitriy V Masterov указывает, что ваш вход и выход не совпадают. –

ответ

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 | 
    +-------------------------+ 
+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 

Код зацикливается на c ountry-years, вычисляя наблюдаемые значения z, используя levelsof, а затем collapse s, чтобы получить одну строку для каждого country-year.

 Смежные вопросы

  • Нет связанных вопросов^_^