2013-11-18 2 views
2

У меня есть набор данных в Stata, который выглядит, как этотНесущие строковые метки переменной строки после RESHAPE

entityID indicator indicatordescr indicatorvalue 
1   gdp   Gross Domestic 100 
1   pop   Population  15 
1   area   Area    50 
2   gdp   Gross Domestic 200 
2   pop   Population  10 
2   area   Area    300 

и существует отображение взаимно-однозначное соответствие между значениями indicator и значений indicatordescr.

Я хочу, чтобы изменить его ширину, то есть на:

entityID gdp  pop  area 
1   100  15  50 
2   200  10  300 

, где я хотел бы gdp переменная метка будет «Gross Domestic», pop ярлык «Население» и area «Площадь».

К сожалению, как я понимаю, невозможно присвоить значение indicatordescr как значе ние значения indicator, так что преобразование не может преобразовать эти метки значений в переменные метки.

Я смотрел на это: Bring value labels to variable labels when reshaping wide

и это: http://www.stata.com/support/faqs/data-management/apply-labels-after-reshape/

, но не понял, как применять те, к моему делу.

NB: переменная маркировка после изменения должна выполняться программно, потому что indicator и indicatordescr имеют много значений.

ответ

3

"String labels" здесь неформальный; Stata не поддерживает метки значений для строковых переменных. Однако то, что здесь требуется, заключается в том, что различные значения строковой переменной становятся переменными метками при переформатировании.

Различные рабочие условия существуют. Вот один: поместите информацию в имя переменной, а затем вытащите ее снова.

clear 
input entityID str4 indicator str14 indicatordescr indicatorvalue 
1   gdp   "Gross Domestic" 100 
1   pop   "Population"  15 
1   area   "Area"    50 
2   gdp   "Gross Domestic" 200 
2   pop   "Population"  10 
2   area   "Area"    300 
end 

gen what = indicator + "_" + subinstr(indicatordescr, " ", "_", .) 
keep entityID what indicatorvalue 
reshape wide indicatorvalue , i(entityID) j(what) string 

foreach v of var indicator* { 
    local V : subinstr local v "_" " ", all 
    local new : word 1 of `V' 
    rename `v' `new' 
    local V = substr("`V'", strpos("`V'", " ") + 1, .) 
    label var `new' "`V'" 
} 

renpfix indicatorvalue 

EDIT Если длина имен переменных кусает, попробуйте другую работу вокруг:

clear 
input entityID str4 indicator str14 indicatordescr indicatorvalue 
1   gdp   "Gross Domestic" 100 
1   pop   "Population"  15 
1   area   "Area"    50 
2   gdp   "Gross Domestic" 200 
2   pop   "Population"  10 
2   area   "Area"    300 
end 

mata : sdata = uniqrows(st_sdata(., "indicator indicatordescr")) 
keep entityID indicator indicatorvalue 
reshape wide indicatorvalue , i(entityID) j(indicator) string 
renpfix indicatorvalue 
mata : for(i = 1; i <= rows(sdata); i++) stata("label var " + sdata[i, 1] + " " + char(34) + sdata[i,2] + char(34)) 
end 

СПУСТЯ EDIT Хотя выше называется обходным, это гораздо лучшее решение, чем предыдущий ,

+0

спасибо, что это делает работа. Однако стоит отметить, что это предотвратит перенос длинных меток. В приведенном выше алгоритме необходимо использовать имена переменных для переноса информации переменной + метки. И изменение будет успешным только в том случае, если имена переменных не превышают 32 символа. Есть ли способ, который использует локальные макросы для преодоления этого недостатка? – Peutch

+0

EDIT работал отлично. Спасибо! – Peutch

+0

Быстрый вопрос: нужно ли очищать mata или sdata из памяти после запуска алгоритма, и если да, то каким образом? – Peutch

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