Pytanie w sprawie dynamic, sas, variables – Dynamiczne nazwy zmiennych w SAS

3

Czy w SAS istnieje sposób na określenie dynamicznych nazw zmiennych w kodzie? tj. używać różnych zmiennych w różnych obserwacjach opartych na wartości innej zmiennej?

Na przykład moim zestawem danych wejściowych może być:

Index  Var1   Var2  Var3
1      78.3   54.7  79.8
3      67.2   56.2  12.3
2      65.3   45.2  98.1
1      56.2   49.7  11.3
1      67.2   98.2  98.6

I chcę dodać kolumnę, która zawiera wartość Var * Index *. tj. wyjście, którego chciałbym, to:

    Index  Var1   Var2  Var3  Var_Index
    1      78.3   54.7  79.8  78.3
    3      67.2   56.2  12.3  12.3
    2      65.3   45.2  98.1  45.2
    1      56.2   49.7  11.3  56.2
    1      67.2   98.2  98.6  67.2

Nie jestem w stanie użyćcall symput aby to zadziałało. Powinienem też wspomnieć, że mój prawdziwy problem jest nieco bardziej skomplikowany, a ja mam już bałaganiarską metodę brutalnej siły, ale szukam czegoś czystego.

Odpowiedź @ keith powinna zadziałać, jeśli po prostu chcesz zapisać wartość ze zmiennej VAR o nazwie kończącej się numerem indeksu w var_index ... jeśli rozwiązanie zawiera więcej zmiennych, zaktualizuj swoje pytanie Jay Corbett

Twoja odpowiedź

4   odpowiedź
3

możesz łatwo odwołać się do wartości zapisanej w Indeksie.

data have;
input Index  Var1   Var2  Var3;
cards;
1      78.3   54.7  79.8
3      67.2   56.2  12.3
2      65.3   45.2  98.1
1      56.2   49.7  11.3
1      67.2   98.2  98.6
;
run;

data want;
set have;
array vars(*) var: ;
var_index=vars(index);
run;
Powinienem być bardziej wyraźny podczas pytania. Powiedzmy, że zamiast tego zmienne to var_IBM var_Apple itp.? user997943
Kod powinien nadal działać, jeśli wszystkie zmienne, które chcesz rozpocząć, to var_ (var: w moim kodzie oznacza wszystkie zmienne zaczynające się od „var”). Jeśli nie, określ pierwszą i ostatnią zmienną na liście tablic rozdzieloną literami „-”, np. tablica vars {*} a - z; Longfish
2

że najprostszym rozwiązaniem byłoby użycie funkcji VVALUEX. Tworzy nazwę zmiennej za pomocą indeksu, a następnie dostarcza ją jako argument funkcji -

var_index = vvaluex(compress("var" || put(index, 8.)));
0

Czy krok danych nie zadziała?

 data assign_value;
  set have;

  if index = 1 then var_index = var1;
  else if index = 2 then var_index = var2;
  else if index = 3 then var_index = var3;
run;

Może czegoś mi brakuje? ale to powinno dać ci wynik z twojego pytania.

Zobacz poniższy kod Keitha, jeśli masz tak wiele. DataParadigms
Problem polega na tym, że tego rodzaju podejście staje się chaotyczne, jeśli powiesz 100-200 zmiennych. Miałem nadzieję na bardziej makro-podejście tutaj, mogłem powiedzieć var_index = var & ind. gdzie makrozmienna ind przechowuje wartość Indeksu user997943
0
data want;
    set have;
    length _var_name $32 _var_num 5;
    array vars(*) var: ;
    /* if you want name of variable */
    _var_name=VNAME(vars(index));
    /* if you want numeric suffix of variable 
            and suffix is not same as position of variable in array
          (so that vars(index) is not usable */
    _var_num=INPUT(SUBSTR(_var_name, ANYDIGIT(_var_name)),32.);
run;

Powiązane pytania