Nochmal: Hilfsarray
Hallo,
ich stehe gerade etwas auf dem Schlauch. Musste mich zwischenzeitlich mal wieder mit etwas anderem beschäftigen und kehre nun zu meinem Programm zurück...kann mir vielleicht jemand mal Schritt für Schritt erklären, wie das Macro "hilfsarray" funktioniert? Habe hier bereits Hilfe bekommen, da ich aber mit Macros völlig unerfahren bin, finde ich jetzt gerade nicht mehr rein.
array
_tmp(10,10) /*_temporary_ wegen der Performance */ /*es wird eine temporäre 10*10-Matrix erzeugt, also mit der selben
Dimension wie Testmuettertag1*/
%do i = 1 %to 10;
tmp&i._1-tmp&i._10
%end;
;
/* Anzahl der Variablen als Indexvariable*/
do i= 1 to 10;
do j = 1 to 10;
_tmp(i,j)= mod(i+j-1,10); /* Verschieben des Index gegenüber dem Vorgänger */
if _tmp(i,j)=0 then _tmp(i,j)=10;
end;
end;
/* Dimensionen für den Vergleich */
%let vgl1=%eval(10*10); /*let definiert eine macro-Variable*/
%let vgl2=%eval((10-1)*10/2);
%mend hilfsarray; /*Hier endet das Macro Hilfsarray*/
- Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Stephanie,Sie können
Hallo Stephanie,
Sie können das Makro wie folgt aufrufen:
data a;
%hilfsarray;
run;
Sehen Sie sich das Ergebnis zunächst an.
%do i = 1 %to 10;
tmp&i._1-tmp&i._10
%end;
erzeugt die Felder, die zu dem array gehören:
array(10,10)
temp1_1-temp1_10
...
temp10_1-temp_10_10;
Beschreiben des arrays:
do i= 1 to 10;
do j = 1 to 10;
_tmp(i,j)= mod(i+j-1,10); /* Verschieben des Index gegenüber dem Vorgänger */
if _tmp(i,j)=0 then _tmp(i,j)=10;
end;
end;
für mich sinnlos:
%let vgl1=%eval(10*10); /*let definiert eine macro-Variable*/
%let vgl2=%eval((10-1)*10/2);
ebenso erschliesst sich nicht der Sinn von (obs,dim)
Es gibt ein in der Online Hilfe ein verständliches Beispiel zu einem
multidimensionalen SAS- Array
Vielleicht wollen Sie ja folgendes Ergebnis erzielen:
%macro hilfsarray(dim,obs); /*Hier beginnt die Definition des Macros "hilfsarray"*/
array
_tmp(10) /*_temporary_ wegen der Performance */ /*es wird eine temporäre 10*10-Matrix erzeugt, also mit der selben
Dimension wie Testmuettertag1*/
tmp1_1-tmp1_10
;
/* Anzahl der Variablen als Indexvariable*/
do i= 1 to 10;
do j = 1 to 10;
_tmp(j)= mod(i+j-1,10); /* Verschieben des Index gegenüber dem Vorgänger */
if _tmp(j)=0 then _tmp(j)=10;
end;
output;
end;
%mend hilfsarray;
data a;
%hilfsarray;
run;
Probieren Sie es mal aus?!
Frdl. Grüße
B. Muschik
So wie es da steht
So wie es da steht funktioniert das Makro überhaupt nicht würde ich sagen ;)
Ist es Teil eines anderen Skripts? Was soll es überhaupt tun? Was ist "obs" und warum taucht es nicht im Makro auf?
Fragen über Fragen.
Gruß,
Simon
Sinn und Zweck der Makrovariablen dim und obs etc.
Hallo zusammen,
Um den Hintergrund diese Makros zu verstehen, möge man sich den Beitrag "Distanzmatrix" durchlesen.
In diesem Makro wird - aufgerufen in einem Datastep - ein 10x10(Hilfs)Array erzeugt, in welchem die Einträge von 1 bis 10 jeweils um eins verschoben sind.
Also:
j=1 j=2 j=3 j=4 j=5 j=6 j=7 j=8 j=9 j=10 ----------------------------------------- i=1 : 1 2 3 4 5 6 7 8 9 10 i=2 : 2 3 4 5 6 7 8 9 10 1 etc. i=10: 10 1 2 3 4 5 6 7 8 9Wozu das ganze, s.a. o.g. Beitrag, bzw. die Anforderung von StephanieCGross.
Ich konnte leider nicht früher antworten.
Gruß
Wolfgang
Ich versuche es nochmal etwas präziser auszudrücken
Hallo Wolfgang,
es ist gar nicht so einfach, meine Frage hier präzise zu formulieren, ich versuche es aber nochmal. Also, ich habe eine 10 X 10 Testmatrix. Nun möchte ich aus dieser Testmatrix einen Hilfsarray "basteln", der am Ende eine Matrix mit 5 Beobachtungen (Zeilen) und 25 Variablen (Spalten). Variable 1.1-1.5 (so könnte man sie vielleicht benennen) sind die 5 Variablen (ursprünglich ZHC1-ZHC5)in der richtigen Reihenfolge, dann folgen Variable 2.1-2.5, das sind im Grunde dieselben Variablen, aber um einen verschoben, das heisst, es wird mit Variable 2 begonnen, dann var3, var4,var5 und schließlich var1.
Als nächstes folgen die Variablen 3.1 -3.5, also dieselben Variablen, nur dass mit var3 bekommen wird.
Wichtig ist für mich halt, dass ich fünfmal ALLE Variablen dort stehen habe, nur eben in veränderter Reihenfolge. Das erscheint mir die einzige Möglichkeit, um die Vergleichbarkeit zu ermöglichen...
?!?
Hallo Stephanie,
das übersteigt gerade etwas mein Vorstellungsvermögen.
Das 10x10 Array (Testmatrix) in meinem Kommentar bzw. resultierend aus obigem Code sieht ja nicht wirklich so aus, sondern "lebt" in einer Zeile. Das sollte aber klar sein.
Weiterhin habe ich ein Vorstellungsproblem mit der Transformation einer 10x10 (10x10=100 Einträge) Testmatrix(Testarray?) in ein 5x25 Hilfsarray (5x25=125 Einträge). Diese Hilsarray in ein Dataset mit 5 Obs und 25 Variablen zu schreiben ist dann wieder das geringste Problem.
Vielleicht kannst Du das mal an sagen wir einem 3x3 Beispiel in einem preformated Tag visualisieren.
Gruß
Wolfgang