Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
Occasional Contributor
Beiträge: 7
Verständnisproblem Merge

Hallo zusammen,

 

ich habe da ein Verständnisproblem, folgender Merge liefert nicht das gewünschte Ergebnis:

 

data teilmenge;

merge

vp(in=a)

bestand.tfaehivj(keep=vnr pnr vgr aet aetnr vgnr eknz avgn tarif)

bestand.tfaehigj(keep=vnr pnr vgr aet aetnr vgnr eknz avgn tarif)

bestand.tfakt(keep=vnr pnr vgr aet aetnr vgnr eknz avgn tarif)

bestand.tfzuk(keep=vnr pnr vgr aet aetnr vgnr eknz avgn tarif)

;

by vnr pnr;

if a;

run;

 

Geht das generell überhaupt nicht? Ich bekomme nur vnr-pnr-Kombinationen aus

 

bestand.tfaehivj

bestand.tfzuk

 

Ich würde mich sehr über eine Aufschlauung freuen.

 

Vielen Dank schon einmal im Voraus!

 

Wolfgang

 

Esteemed Advisor
Beiträge: 6.646
Betreff: Verständnisproblem Merge

Da alle Datasets die gleichen Variablen haben, werden die Werte in der Reihenfolge des Einlesens überschrieben. Das zuletzt für eine Kombination gelesene Dataset "sticht". Die davor gelesenen Werte fallen durch den Rost.

 

Die Werte aus tfaehivj kommen dann, wenn in den drei anderen Tabellen keine Matches existieren; haben alle Tabellen ein Match, zieht die letzte.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Occasional Contributor
Beiträge: 7
Betreff: Verständnisproblem Merge

Ich bekomme tatsächlich zu einer bestimmten vnr-pnr-Kombination Sätze aus der tfaehivj, obwohl es auch welche in der tfaehigj gibt. Die Ausprägungen wurden also nicht überschrieben, daher mein Verständnisproblem, denn die Dateien (in VP sind nur die vnr-pnr-Kombinationen) tauchen ja nicht ohne Grund in der Reihenfolge auf ;-)

 

Oder ist das etwa einfach Zufall?

Esteemed Advisor
Beiträge: 6.646
Betreff: Verständnisproblem Merge

Nehmen wir mal folgende Situation:

Kerntabelle x hat ein Match

Tabelle a hat zwei

Tabellen b,c und d haben jeweils eins

data z;
merge
  x (in=x)
  a
  b
  c
  d
;
by .....;
run;

Der data step liest der Reihe nach die ersten Matches aus allen Tabellen; da d die letzte war, kommen ihre Daten in z.

Dann wird das zweite Match aus a gelesen; da keine weiteren Matches in b, c und d vorhanden sind, wird dort nicht mehr gelesen, und die Daten aus a kommen in z.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Occasional Contributor
Beiträge: 7
Betreff: Verständnisproblem Merge

für den ersten Match okay, da kommen die Matches aus d. Aber für den zweiten Match aus x habe ich aber noch Matches in a UND b,

bekomme aber nur die aus a.

Esteemed Advisor
Beiträge: 6.646
Betreff: Verständnisproblem Merge

Soll heißen, in a und b gibts je zweimal die selbe Kombination der by-Variablen?

Könntest Du mal ein paar Beispieldaten posten, mit denen sich der Effekt zeigen lässt?

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Frequent Contributor
Beiträge: 102
Betreff: Verständnisproblem Merge
[ Bearbeitet ]

Hallo zusammen,

 

Wenn in jedem sub-Dataset dieselben match Variable vorhanden sind, dann arbeitet SAS wie #Kurt es gesagt hat

ansonsten scheint es keine besondere Logik bei der Auswahl der zu überschreibenden Variable zu geben.

 

Im folgenden Versuch erkennt ihr in der Variable 'name' welcher Spaltenwert genommen wurde, bei %doit(match=1) wird der letzte Dataset genommen und bei %doit(match=0) scheint es willkürlich zu sein:


%macro doit(match=0);
   %do i=1 %to 5;
   proc sort data=sashelp.class out=class&i.; where age<=12; by sex; run;
   data class&i.;
      length name name&i. $20 height&i. 8;
      set class&i.;
      name&i.="&i."||strip(name);
      name="&i."||strip(name);
      height&i.=&i.;
      keep sex name: ;
      if _N_ eq &i. then call missing(name,name&i.);
      %if &match. eq 0 %then %do;
         if _N_ in (%eval(&i.-1),&i.,%eval(&i.+1));
      %end;
   run;
   %end;
%mend;%doit(match=1);

proc sort data=sashelp.class out=class;where age<=12;by sex;run;
data teilmenge;
   merge 
   class(in=a)
   class1(keep=sex name: )
   class2(keep=sex name: )
   class3(keep=sex name: )
   class4(keep=sex name: )
   class5(keep=sex name: )
   ;
   by sex;
   if a;
run;
data teilmenge_sorted;
   retain sex name name1 name2 name3 name4 name5 ;
   set teilmenge;
run;

MfG

________________________

- That still only counts as one -

Contributor
Beiträge: 24
Betreff: Verständnisproblem Merge
[ Bearbeitet ]

Hallo Wolfgang,

das geht so generell nicht, weil die Arbeitsweise von Merge solche Vorgehensweise nicht unterstützt. Bei Merge überschreibt die letzte Tabelle die Werte der vorigen, aber nur wenn auch ein matching vorliegt. Um auch doppelte Datensätze zu bekommen müssen die zu mergenden Dateien erst zu einer Tabelle zusammengefügt und sortiert werden, Dann kann diese Tabelle gegen vp gemerged werden.

Data test1;
  input a b c;
  cards;
1 1 1
2 1 1
3 1 1
run;
Data test2;
  input a b c;
  cards;
2 2 2
3 2 2
4 2 2
run;
Data test3;
  input a b c;
  cards;
3 3 3
4 3 3
5 3 3
run;
Data match;
  input a;
 cards;
1
2
3
4
5
run;
/* Das geht nicht! */
Data mergen;
  merge match(in=match) test1 - test3;
  by a;
  if match;
run; 

/* wenn schon */
Data test;
  set test1 - test3;
run;
Proc sort data = test; by a; run;
Data mergen;
  merge match(in=match) test;
  by a;
  if(match);
run;

/*oder*/
Proc sql feedback;
  create table mergen as 
  select  match.a, t2.b, T2.c
  from WORK.MATCH 
  left outer join (
    Select * from WORK.TEST1
    union all
    select * from WORK.TEST2 
    union all
    select * from WORK.TEST3
  ) as T2 
  on (T2.a = MATCH.a) 
;

Generell ist das Mergen mehrerer Tabellen nicht zu empfehlen. Ich ziehe im allgemeinen das Joinen mit Proc sql dem Mergen im Data Step vor  (Ausnahme das Mergen ohne by).

 

Viele Grüße

Jan

 

Occasional Contributor
Beiträge: 7
Betreff: Verständnisproblem Merge

Ich habe etwas rumgespielt, die Anzahl der Matches aus a bestimmt die Anzahl der Observationen von z, die Matches aus b und d überschreiben, wie Grischa beschreibt, willkürlich die Matches aus a.

 

Dankeschön!