2016-07-25 4 views
0

У меня есть автоматический набор данных, и хотел бы создать несколько гистограмм:Loop несколько местных жителей

sysuse auto, clear 
     local mpg "22 20 17" 
     local titles "Title1 Title2 Title3" 
     local path "twentytwo twenty seventeen" 

foreach x of local mpg { 
foreach y of local titles { 
foreach z of local path { 
      keep if mpg==`x' & foreign==0 
      egen hv_rank=rank(price) 
     # delimit ; 
     graph bar price, 
      over (make, sort(hv_rank) reverse label(labsize(vsmall))) 
      ytitle("") 
      horizontal title("`y'", size(medium)) 
      ; 
     # delimit cr 
      graph save "$dir_gphs\mpg`z'f0-bal.gph", replace 
      drop hv_rank 
      sysuse auto, clear 
      } 
      } 
      } 

Я не хочу, чтобы создать гистограмму для каждой возможной комбинации «ценности» моих 3 местных жителей но вместо этого я хотел бы иметь if x=22, затем y=Title1, а затем z=twentytwo. Аналогичным образом if x=20 затем y=Title2 и z=twenty.

Это должна быть простая проблема. И я думаю, что мой поиск до сих пор не принес мне никаких полезных результатов, потому что я не знаю правильного словаря проблемы.

ответ

2

Вот как я подошел бы к проблеме.

. local mpg 22 20 17 

. local titles `" "Title 1" "Title 2" "Title 3" "' 

. local path twentytwo twenty seventeen 

. 
. forvalues i = 1/3 { 
    2.   local x : word `i' of `mpg' 
    3.   local y : word `i' of `titles' 
    4.   local z : word `i' of `path' 
    5.   display `" `x' --- `y' --- `z' "' 
    6.   } 
22 --- Title 1 --- twentytwo 
20 --- Title 2 --- twenty 
17 --- Title 3 --- seventeen 

Или же

. local set1 22 "Title 1" twentytwo 

. local set2 20 "Title 2" twenty 

. local set3 17 "Title 3" seventeen 

. forvalues i = 1/3 { 
    2.   local x : word 1 of `set`i'' 
    3.   local y : word 2 of `set`i'' 
    4.   local z : word 3 of `set`i'' 
    5.   display `" `x' --- `y' --- `z' "' 
    6.   } 
22 --- Title 1 --- twentytwo 
20 --- Title 2 --- twenty 
17 --- Title 3 --- seventeen 
+1

Snap! Тот же ответ, по существу. Поскольку есть какое-то смещение, я оставлю свою стену. –

+1

Да, мы связали. Нам нужны плагины для наших браузеров, чтобы рассказать друг другу, на каком URL мы смотрим. Я позволю себе стоять, потому что я предпочитаю свой второй пример, немного дальше от исходного вопроса, потому что он лучше обобщает добавление другого набора значений, чем оригинал. Оба демонстрируют использование двойных кавычек вокруг многословных названий, и первое показывает, что избегает тонкой проблемы, помещая несколько цитируемых элементов в один макрос. –

+0

Большое спасибо Нику и Уильяму. Я в основном пошел с первой версией решения Williams. Мне очень понравились двойные записи в заголовках, позволяющие мне использовать пробелы для названий. –

1

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

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

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

sysuse auto, clear 

forval j = 1/3 
    local x : word `j' of 22 20 17 
    local title: word `j' of Title1 Title2 Title3 
    local path: word `j' of twentytwo twenty seventeen 

    graph bar price if mpg==`x' & foreign==0 /// 
    over(make, sort(1) reverse label(labsize(vsmall))) /// 
    ytitle("") horizontal title("`title'", size(medium)) 

    graph save "$dir_gphs\mpg`path'f0-bal.gph", replace 
}