2015-04-24 3 views
0

У меня есть ситуация, когда мне нужно использовать значения в двух переменных mpg и сделать, чтобы создать график. Переменная mpg - это числовая переменная и . - это строковая переменная с пробелами. Следующий код может использовать значения в mpg, чтобы создать график, когда я игнорирую значения в переменной , составляющей. Однако я хотел бы иметь соответствующее строковое значение из переменной make, которые появляются в графическом подзаголовке. По какой-то причине этот код дает ошибку слишком много «)» или «]» после цикла по несколько значений в переменной миль на галлонStata: Levelsof со строковой переменной

sysuse auto.dta, clear 

gsort - trunk 
keep in 1/5 

levelsof mpg, local(levels) 
global xlist `levels' 
levelsof make, local(levelsdes) 
global ylist `levelsdes' 

sysuse auto.dta, clear 
gen bar=1 
local k 1 2 3 4 5 
local n : word count $xlist 
forvalues x =1/`n' { 
local i : word `x' of $xlist 
local z : word `x' of `k' 
local j : word `x' of $ylist 

egen a_`i'= total(bar) if mpg == `i' 

twoway (bar a_`i' mpg), subtitle(`j') title(Trends in Error `i') 
graph export "`z'.png", as(png) replace 
} 
+0

Добавить отображение "- \' i '- \ 'j' - \' z '- "в ваш цикл, и вы увидите начало своей проблемы. –

ответ

1

Проблема здесь хочет использовать конкретное значение строки от переменной в заголовке графика. Ввод строковых значений в макрос с использованием levelsof, а затем вытаскивание их снова (1) косвенным и (2) сложным, поскольку пробелы затрудняют любое извлечение на основе слов. Так, мне кажется, что вы можете и должны сделать это более непосредственно:

sysuse auto.dta, clear 
gsort - trunk 
gen bar = 1 

forval i = 1/5 { 
    egen a_`i'= total(bar) in `i' 
    twoway bar a_`i' mpg, subtitle("`=make[`i']'") 
    graph export "`i'.png", as(png) replace 
} 

Там будет что-то эквивалентное для реальной проблемы, даже если строковые значения относятся к подмножествам наблюдений, которые не одиночки, а получите более подробные рекомендации, которые вы должны объяснить больше о реальной проблеме.

Примечание кстати, что

local k 1 2 3 4 5 

forvalues x = 1/5 { 
    local z : word `x' of `k' 
} 

также является косвенным. Ваша петля настроена на цикл более 1/5, поэтому вам не нужно делать это дважды. Определение k, а затем извлечение его элементов в последовательности можно избежать, просто указав локальный макрос x.

+0

из того, что я понимаю, использование * in * в команде egen не то, что я ищу. Мне нужно выбрать пять самых больших значений миль на галлон, а затем подсчитать количество транспортных средств, имеющих соответствующий миль на галлон (в реальном примере идентификационная переменная (mpg) уникальна для каждой марки). Как мне объяснить это в приведенном выше коде – Rodrigo

+0

Пожалуйста, перепишите свой вопрос, чтобы задать свою реальную проблему, если мой ответ не поможет решить вашу проблему. Насколько я вижу, я написал код, чтобы сделать то, что не удалось сделать вашему коду. –

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