Anzahl Datensätze über mehrere Variablen
Hallo zusammen,
ich habe eine simple Frage, für die ich aber bislang keine Antwort gefunden habe, und zwar:
Es liegt vor eine SAS-Tabelle mit den Feldern word1 - wordn. In diesen Feldern stehen alphanumerische Werte. Beispiel:
1. Datensatz word1 = Hallo word2 = Welt
2. Datensatz word1 = Erdball word2 = Hallo
Der Variableninhalt "Hallo" kommt also einmal in der Variable word1 und einmal in der Variable word2 vor, ich möchte aber "insgesamt" - über alle Variablen - zählen, wie oft das Wort "Hallo" vorkommt.
Ich möchte nun also als Output pro Variableninhalt (über alle Variablen hinweg) die Anzahl der Datensätze pro Eintrag haben, d.h.
Hallo 2
Welt 1
Erdball 1
Man könnte natürlich mit proc freq, proc means oder proc summary mehrere Durchläufe (pro Variable word1 und word2) starten und anschließend wieder zusammenführen.
Mein Problem ist die Laufzeit: Die mir vorliegende Tabelle hat ca. 550.000 Einträge und als Variablen word1 bis word 910.
Gibt es eine Prozedur-, Macro- oder Hash-Möglichkeit, indem ich mit einmal (!) Lesen diese Aufgabe bewältigen kann?
Jede Hilfe ist gern gesehen, Danke!
Gruß, Roman Kolbe
- Anmelden oder Registrieren um Kommentare zu schreiben

Transponieren der Variablen
Hallo Herr Kolbe,
um alle Variablen in einem Rutsch auszulesen, müssen die Werte erst alle in eine Spalte geschrieben werden. Dies geschieht z. B. mit einem Array in einem Data Step.
data Test;
Length word1 - word2 $20;
word1 = "Hallo" ; word2 = "Welt" ; output;
word1 = "Erdball"; word2 = "Hallo"; output;
run;
data Test1;
length wert $20;
keep Wert;
set Test;
array w word1-word2;
do over w;
wert = w;
output;
end;
run;
/* auszählen */
proc freq data = Test1;
table wert /out = Freq (drop = percent) nocum;
run;
Dies ist zwar zweimal lesen, aber man kann die Zwischentabelle lokal in WORK speichern, und dann sollte das zweite Lesen von Proc Freq eigentlich kein Problem sein. Ich habe allerdings noch nie mit Tabellen mit ca. 500 Millionen Zeilen gearbeitet.
Falls einzelne Felder Missing Values enthalten, kann man die Größe auch reduzieren, in dem man sie in dem Fall nicht ausgibt.
Schöne Grüße
Jan
Große Datenmengen
Hallo,
die Performance bei großen Datenmengen ist extrem maschinenabhängig. Und dann muss auch noch die Speicherkonfiguration (Sortsize, memsize, sumsize) stimmen.
Wir haben hier einen Unix-Server mit 7 DualCore-CPUs, 22GB RAM und insgesamt knapp 10TB Plattenplatz. Unsere größte einzelne Tabelle hat 21 Felder und gut 960 Mio. Datensätze.
Sortieren dauert - wenn nichts anderes auf der Maschine läuft - ungefähr 2 Stunden.
Proc freq geht aber schneller. Dafür kann ein Merge extrem lange dauern (4 - 8 Stunden).
Wie das auf einem Standalone-PC aussieht, wage ich aber nicht zu prognostizieren... ;-)
Schönen Gruß
Olaf Musch
PROC FREQ
Mit SQL könnte man zwar per Union mehrere Distinct und Group By Varianten untereinander schreiben, das würde dann intern aber mehrere Datenläufe generieren. Mit PROC FREQ kann man dies in einem Lauf erledigen, aber dabei werden für pro Variable eine Ausgabedatei angelegt.
proc freq Data=MYDATASET;
tables myfield_1 /noprint out=OutDataset_1;
tables myfield_2 /noprint out=OutDataset_2;
....
tables myfield_n /noprint out=OutDataset_n;
run;
MfG // Martin Schaefer
Hash
Vielen Dank für den Ansatz, aber ich habe es nun anders umgesetzt mit einem Hash-Ansatz. Falls jemand Interesse hat, kann ich das mal hier vorstellen, mir fehlt allerdings momentan die Zeit dafür.
Gruß, Roman Kolbe