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
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.
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?
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.
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.
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?
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 -
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
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!
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!