Как я могу назвать несколько графических изображений в итерационной форме? - PullRequest
1 голос
/ 28 марта 2019

У меня есть следующая структура данных:

id id_name date observation
1    aa    2000     1
1    aa    2001     2
1    aa    2002     1
2    dd    2000     1.5
2    dd    2001     0
2    dd    2002     1

Я генерирую несколько линейных графиков, используя код ниже:

forvalue i = 1/300 {
    graph twoway line observation date if id == `i', ///
    name("graph_`i'") title("?")
}

Моя проблема в том, что я не знаю, как поставить имя каждого id (содержащегося в переменной id_name) в качестве заголовка каждого графика.

Я пытался добиться этого с помощью локального макроса, но в Stata я не могу определить это с помощью if:

local name = id_name if id == `i'

Мне удалось сделать следующее:

forvalue i = 1/300 {
    sort id date
    local title = id_name 
    graph twoway line observation date if id == `i', ///
    name("graph_`i'") title("`title'")
    drop if id == `i'
}

Однако проблема в том, что на каждом шаге итерации удаляются данные.

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2019

Вот еще один способ сделать это, бесстыдно позаимствовав пример @Pearly Spencer.

Достаточно знать об одном наблюдении, где имя, которое вы хотите использовать, хранится в качестве значения id_name.Найти первое или последнее такое наблюдение легче всего.

clear
input id str2 id_name date observation
1    aa    2000     1
1    aa    2001     2
1    aa    2002     1
2    dd    2000     1.5
2    dd    2001     0
2    dd    2002     1
3    bb    2000     1.5
3    bb    2001     0
3    bb    2002     1
end

gen long obsno = _n 

forvalue i = 1 / 3 {
    su obsno if id == `i', meanonly 
    display `"graph twoway line observation date if id == `i', name("graph_`i'") title("`=id_name[r(min)]'")"'
}

Другой подход, который является более удовлетворительным, потому что он имеет больше приложений позже, состоит в том, чтобы скопировать строковые значения в id_name, чтобы они стали метками значения id.labmask из Stata Journal сделает это.Затем поиск метки значения является стандартной задачей для расширенной функции макроса.

labmask id, values(id_name) 

forvalue i = 1 / 3 {
    display `"graph twoway line observation date if id == `i', name("graph_`i'") title("`: label (id) `i''")"'
}
2 голосов
/ 28 марта 2019

Вот один из способов сделать это:

clear
input id str2 id_name date observation
1    aa    2000     1
1    aa    2001     2
1    aa    2002     1
2    dd    2000     1.5
2    dd    2001     0
2    dd    2002     1
3    bb    2000     1.5
3    bb    2001     0
3    bb    2002     1
end

mata: st_local("idnames", invtokens(st_sdata(., "id_name")'))

local idnames : list uniq idnames
tokenize `idnames'

forvalue i = 1 / 3 {
    display `"graph twoway line observation date if id == `i', name("graph_`i'") title("``i''")"'
}

graph twoway line observation date if id == 1, name("graph_1") title("aa")
graph twoway line observation date if id == 2, name("graph_2") title("dd")
graph twoway line observation date if id == 3, name("graph_3") title("bb")

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

...