Перенос строковых меток строковой переменной после изменения формы


У меня есть dataset в Stata, который выглядит так

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 переменная метка была "валовой внутренний продукт", pop метка "население" и area "площадь".

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

Я посмотрел на это : приведите метки значений к меткам переменных при изменении формы wide

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

Но не понимал, как применить их к моему случаю.

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

1 2

1 ответ:

"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 

Редактировать если длина имен переменных кусается, попробуйте другой обходной путь:

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 

Позже редактировать, хотя вышеизложенное называется обходной путь, это гораздо лучшее решение, чем предыдущее.