Frage an sas, dynamic, variables – Dynamische Variablennamen in SAS

3

Gibt es in SAS eine Möglichkeit, dynamische Variablennamen im Code anzugeben? d.h. unterschiedliche Variablen für unterschiedliche Beobachtungen basierend auf dem Wert einer anderen Variablen verwenden?

Mein Eingabedatensatz könnte beispielsweise sein:

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

Und ich möchte eine Spalte hinzufügen, die den Wert von Var * Index * enthält. Das heißt, die Ausgabe, die ich haben möchte, wäre:

    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

Ich kann nicht verwendencall symput um dies zum Laufen zu bringen. Außerdem sollte ich erwähnen, dass mein eigentliches Problem etwas komplizierter ist und ich bereits eine chaotische Brute-Force-Methode habe, aber ich suche nach etwas Sauberem.

Die Antwort von @ keith sollte funktionieren, wenn Sie lediglich den Wert aus der VAR-Variablen mit einem Namen speichern möchten, der mit der Indexnummer in var_index endet ... Wenn die Lösung weitere Variablen enthält, aktualisieren Sie Ihre Frage Jay Corbett

Deine Antwort

4   die antwort
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;

2

die einfachste Lösung wäre die Verwendung der VVALUEX-Funktion. Es erstellt den Variablennamen unter Verwendung des Index und liefert ihn dann als Argument an die Funktion -

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

Würde ein Datenschritt nicht funktionieren?

 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;

Mir könnte etwas fehlen? Dies sollte Ihnen jedoch das Ergebnis Ihrer Frage liefern.

Das Problem ist, dass diese Art von Ansatz chaotisch wird, wenn Sie 100-200 Variablen sagen. Ich hoffte auf einen makrobasierten Ansatz, hier könnte ich var_index = var & ind sagen. Dabei speichert die Makrovariable ind den Wert von Index user997943
Sehen Sie sich den Code von Keith an, wenn Sie so viele haben. DataParadigms
3

können Sie einfach auf den im Index gespeicherten Wert verweisen.

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;
Der Code sollte weiterhin funktionieren, wenn alle gewünschten Variablen mit var_ beginnen (var: in meinem Code bedeutet, dass alle Variablen mit 'var' beginnen). Wenn nicht, geben Sie die erste und die letzte Variable in der Array-Liste an, die durch '-' getrennt sind, z. Array-Variablen {*} a - z; Longfish
Ich hätte klarer sein sollen, wenn ich gefragt hätte. Angenommen, die Variablen waren stattdessen var_IBM var_Apple usw.? user997943

Verwandte Fragen