Набор подстановочных совпадений из имен переменных - PullRequest
0 голосов
/ 31 января 2020

У меня есть набор переменных, скажем varA, varB и varC.

Как я могу l oop сверх только постфиксы A, B и C?

Я знаю, что могу получить все сопоставление переменных следующим образом:

des var*

              storage   display    value
variable name   type    format     label      variable label
-------------------------------------------------------------------------------------------------------------------------------------
varA            float   %9.0g                 
varB            float   %9.0g                 
varC            float   %9.0g                 

Однако есть ли способ извлечь только соответствующий компонент и l oop поверх него?

Идеальный код будет примерно таким, как показано ниже:

des var*

foreach postfix in `r(wildcardmatches)' {
    display "`postfix'"
}

Если бы существовал набор r(wildcardmatches).

Ответы [ 3 ]

3 голосов
/ 31 января 2020
* sandbox 
clear
set obs 1 
foreach v in varA varB varC { 
    gen `v' = 42 
}

* core idea and verification
unab wanted : var* 
local wanted : subinstr local wanted "var" "", all

display "`wanted'"
A B C
1 голос
/ 31 января 2020

Команду ds также можно использовать:

clear
set obs 1

foreach v in varA varB varC { 
    generate `v' = 42 
}

ds var*
foreach x in `"`= subinstr("`r(varlist)'", "var", " ", .)'"' {
    display "`x'"
}

 A  B  C

РЕДАКТИРОВАТЬ NJ C:

foreach v of var var* { 
    display "`: subinstr local v "var" "", all'" 
} 

может показаться, что эта упрощенная идея выглядит так же. То есть, если вы собираетесь набрать l oop по шаблону varlist, вы можете l oop напрямую с помощью foreach и указанного varlist. Вам не нужно ds, чтобы набрать sh varlist в r(varlist).

0 голосов
/ 31 января 2020

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

local prefix="var"
foreach variable of varlist `prefix'* {
    local postfix=subinstr("`variable'", "`prefix'", "", .)
    // Work with postfix
}
...