Hallo!
ich bin Anfänger mit SAS und sitze seit 2 Stunden an einem wahrscheinlich leichtem Problem....Ich arbeite an meiner medizinischen Promotion.
Das Problem:
Ich habe 2 Tabellen in SAS. In einer Tabelle habe ich eine Variable in einer Spalte, die einfach nur angibt, ob es sich hier um einen Studienteilnehmer handelt oder nicht. Die Variable ist also 0 oder 1.
In Tabelle 2 fehlt aber diese Variable. Ich muss also die Information zum Studienteilnehmer in die Tabelle 1 bringen. Sprich: Ich muss die Spalte aus Tab 1 in Tab 2 anfügen.
In Excel einfach, ein S-Verweis und fertig.
Aber wie mache ich das in SAS? Merge verstehe ich nicht.
Kann hier jemand helfen??
Danke!
Viele Grüße
Silke
Hallo!
Ganz lieben Dank für die viele Mühe, die Sie Beide sich gemacht haben!!
Ich habe die Lösungen angesehen und herum gebastelt, aber bisher leider ohne Ergebnis.
Ich verstehe allerdings auch nur wenig von den angegeben Programmierungen.
Problem
Tabelle 1 enthält u.a die Spalte Pseudonyme und dazu die Spalte Studienpopulation 1/ 0
Tabelle 2 enthält u.a die Spalte Pseudonyme und dazu nicht Spalte Studienpopulation
Die Tabellen sind nicht identisch
Ich brauche die Spalte Studienpopulation aus Tabelle 1 auch in Tabelle 2 - gematcht auf die Pseudonyme.
Ich bekomme es einfach nicht hin. Auch nicht mit keep Pseudonym if = abcderfghhjjjj
Ich brauch Hilfe.....
Danke!
Viele Grüße
Silke
Hallo @Silke ,
können Sie vielleicht mal ein paar Beispieldaten oder Code posten?
Die Lösungen von @Kurt_Bremser sollten funktionieren.
proc sql; create table ERGEBNIS as select T1.*, T2.Studienpopulation from WORK.TABELLE1 T1 left join WORK.TABELLE2 T2 on T1.Pseudonym = T2.Pseudonym ; quit;
Im obigen Beispiel wird die Tabelle ERGEBNIS erzeugt. Es werden alle Spalten aus Tabelle TABELLE1 übernommen, aus der Tabelle TABELLE2 nur das Feld Studienpopulation. Verknüpft wird anhand des Feldes Pseudonym, welches in beiden Tabellen vorhanden sein muss.
Alle Tabellen liegen in dem Beuispiel in WORK. Gegebenenfalls liegen die Daten bei Ihnen in SASUSER oder einer ganz anderen Bibliothek vor.
Viel Erfolg!
Ich ersetze mal in meinem SQL meine Variablen und Tabellen durch die Gewünschten:
proc sql;
create table alles2 as
select
t2.*,
t1.studienpopulation
from tabelle2 as t2
left join tabelle1 as t1
on t2.pseudonyme = t1.pseudonyme
;
quit;
Die anderen Methoden sind sinngemäß anzupassen.
Hier die 4 möglichen Methoden, die sich anbieten, um ein sogenanntes "Lookup" durchzuführen:
/* basteln eines Beispiels */
data teilnehmer;
set sashelp.class (keep=name);
studie = rand('integer',0,1);
run;
/* 1. DATA step */
/* da SASHELP.CLASS nach Name sortiert ist, ist sortieren hier nicht notwendig */
/* andernfalls kann es sein, dass man eine oder beide Tabellen sortieren muss */
data alles1;
merge
sashelp.class (in=c)
teilnehmer
;
by name;
if c;
run;
/* 2. SQL braucht den SORT nicht, weil es bei Bedarf selbst implizit sortiert */
proc sql;
create table alles2 as
select
c.*,
t.studie
from sashelp.class as c
left join teilnehmer as t
on c.name = t.name
;
quit;
/* 3. Methode mit automatisch generiertem Format */
data fmt;
set
teilnehmer (rename=(name=start studie=label))
end=ende
;
type = 'C';
fmtname = 'studie';
output;
if ende
then do;
label = .;
start = "other";
hlo = 'O';
output;
end;
run;
proc format cntlin=fmt;
run;
data alles3;
set sashelp.class;
studie = put(name,studie.);
/* falls STUDIE numerisch sein soll, hier noch eine INPUT() Funktion verwenden */
run;
/* 4. modernste und schnellste Methode, ist aber vomn Speicher abhängig */
data alles4;
set sashelp.class;
if _n_ = 1
then do;
length studie 8;
declare hash tn (dataset:'teilnehmer');
tn.definekey('name');
tn.definedata('studie');
tn.definedone();
studie = .;
end;
rc = tn.find();
drop rc;
run;
Hallo!
Ich komme leider immer noch nicht klar. Langsam werde ich wahnsinnig. Dabei sieht es so einfach aus.....
Können Sie die SQL Anweisung einmal in SAS schreiben? Meine Tabellen sollen in perm.
Lieben Dank
Silke
Hallo @Silke ,
die SQLs sind alle in SAS geschrieben.
Ich fürchte, ohne Logfile, Beispieldaten oder Code kommen wir nicht weiter.
Viele Grüße!
Wenn Sie noch Probleme haben, Beispielcode an Ihre Datenstrukturen anzupassen, dann müssen wir weiter vorne anfangen.
Zuallererst müssen wir wissen, wie die beiden beteiligten Datasets aussehen. Am schnellsten geht das, indem man einen DATA Step mit DATALINES postet, weil dann alle Attribute und Inhalte eindeutig sind, und wir nur den Code in unsere Umgebung kopieren uns ausführen müssen.
Wenn das auch noch zu schwierig ist, bitte zumindest alle Variablennamen, -typen und etwaige Formate (geben Aufschluss ob etwas z.B. ein Datum ist) posten, sowie Beispiele für den Inhalt in tabellarischer Form.
Und dann brauchen wir noch ein Beispiel für das erwartete Ergebnis.
Bereits versuchter Code ist hilfreich; in dem Fall bitte das Log des gesamten Schritts in ein Fenster kopieren, welches mit diesem Icon geöffnet wurde:
Hallo Silke,
am besten lädst Du Dir das Makro, das in dem verlinkten Artikel zu KurtBremsers Kommentar ist einmal runter.
https://blogs.sas.com/content/sastraining/2016/03/11/jedi-sas-tricks-data-to-data-step-macro/
Das Makro ausführen, dann wird es kompiliert und ist Deiner SAS-Umgebung (Windows oder Linux/UNIX?) bekannt.
Dann führst Du das Makro folgendermaßen aus, Du musst vorher eine Makrovariable (%let...) belegen sonst kann es sein, dass das Ergebnis irgendwo ins Nirwana geschrieben wird, so war es bei mir und kommt auf die Konfiguration der SAS-Umgebung an.
%let userdir=<Windows- oder Linuxpfad in dem Du SChreibberechtigung hast ohne abschließendes Slash>;
%data2datastep(<Tabellenname1>,<SAS-Bibliothek>);
%data2datastep(<Tabellenname2>,<SAS-Bibliothek>);
Das Ergebnis sind dann zwei .sas Programme in dem vorher festgelegten Verzeichnis (%let userdir=....).
Dort werden Deine Tabellen in ein Datastep mit Datalines (s.a. Kommentar von KurtBremser unten).
Diese Programme hier posten, dann kann Dir weitergeholfen werden.
VG
Wolfgang
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!