LesezeichenAbonnierenRSS-Feed abonnieren
Silke
Calcite | Level 5

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

 

 

10 ANTWORTEN 10
Noki
Calcite | Level 5

Hallo Silke,


 


du benötigst hierbei tatsächlich einen Merge oder ein sql mit dem du die Tabellen zusammen bringst.


 


Erste Möglichkeit mit SAS:


 


data ergebnis;


   merge tab1(in=A) lookup(in=B keep=lookupvar studienteilnehmer);


   by lookupvar;


   if a;


run;


 


Hiermit spielst Du die zwei Felder "lookupvar" und "studienteilnehmer" aus der Tabelle lookup über das Schlüsselfeld lookupvar an die Tabelle tab1 an. Klassische optionen wie keep und drop bleiben unberührt.


Da dies ein left join ist, braucht es die Einordnung mit dem in=a.


 


Lösung mit sql:


 


proc sql;


   create table neu as


   select a.*, b.studienteilnehmer


   from tab1 as a


   left join lookup as b on (a.lookupvar=b.lookupvar)


   ;


quit;


 


Im Grunde sind sich die beiden Verarbeitungen sehr ähnlich. Mit beiden holst Du ein zweites Feld an die ursprüngliche Tabelle ran. Hier davon ausgegangen, dass alles im work ist.


 


Soweit verständlich?


 


Viel Erfolg.


 


Niko





Silke
Calcite | Level 5

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

CKothenschulte
Obsidian | Level 7

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!

Kurt_Bremser
Super User

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.

Kurt_Bremser
Super User

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;
Silke
Calcite | Level 5

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

CKothenschulte
Obsidian | Level 7

Hallo @Silke ,

 

die SQLs sind alle in SAS geschrieben.

Ich fürchte, ohne Logfile, Beispieldaten oder Code kommen wir nicht weiter.

 

Viele Grüße!

Kurt_Bremser
Super User

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:

Bildschirmfoto 2020-04-07 um 08.32.59.jpg

WolfgangHornung
Obsidian | Level 7

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

 

 

Christine2
Fluorite | Level 6
Hallo,

Du hast doch sicherlich eine gemeinsame Spalte. Name oder Patienten-ID.

Über die kannst Du joinen und so die Spalte in die zweite Tabelle aufnehmen.

Viel eleganter wäre es aber die Möglichkeiten von SAS zu nutzen und Dir aus
der ersten Tabelle ein Format zu basteln. Auch Patienten-ID ->
Studienteilnehmer. Du müsstest dann die Spalte in deiner zweiten Tabelle
gar nicht ergänzen, sondern wüsstest in jeder Tabelle mit Patienten-ID, ob
es ein Studienteilnehmer ist oder nicht.

Leider tipp ich vom Handy, deswegen kann ich Dir keinen Programmschnipsel
anbieten.
In der Hilfe kannst Du unter proc format schauen.

Schönen Gruß
Christine

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

Diskussionsstatistiken
  • 10 Antworten
  • 3612 Aufrufe
  • 16 Kudos
  • 6 in Unterhaltung