LesezeichenAbonnierenRSS-Feed abonnieren
WolfgangHornung
Fluorite | Level 6

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

 

8 ANTWORTEN 8
Kurt_Bremser
Super User

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.

WolfgangHornung
Fluorite | Level 6

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?

Kurt_Bremser
Super User

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.

WolfgangHornung
Fluorite | Level 6

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.

Kurt_Bremser
Super User

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?

Oligolas
Barite | Level 11

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

________________________

- Cheers -

jh_ti_bw
Obsidian | Level 7

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

 

WolfgangHornung
Fluorite | Level 6

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!

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Diskussionsstatistiken
  • 8 Antworten
  • 1915 Aufrufe
  • 0 Kudos
  • 4 in Unterhaltung