Gibt es in SAS eine ähnliche Funktion wie in Excel: Werte ersetzen bzw. ergänzen?
Eine Beispiel:
ich habe Werte wie
BIV1
BiV2
BIV3
BIV
BIV1_ABC
BIV2_ABC
BIV3_ABC..........
Diese Werte sollen umbenannt werden in
BIV1Y
BIV2Y
BIV3Y
BIVY
BIV1Y_ABC
BIV2Y_ABC
BIV3Y_ABC
Danke vorab!
Hallo @Fay123,
je nachdem, wieviele Ersetzungen zu machen sind, könnte man das z.B. über eine Zuordnungstabelle lösen, die man an die Daten joined oder bei weniger Ersetzungen einfach mit der TRANWRD-Funktion, die ganze Wörter in einem String ersetzen kann.
Viele Grüße
Michael
Ich sehe neben einem Join mit einer externen Tabelle noch mindestens zwei weitere effektive Wege, wie die 'Umbenennung' von statten gehen kann:
Code für Variante 1:
PROC FORMAT LIB=WORK;
VALUE $fmtNewNames
"BIV1" = "BIV1Y"
"BIV2" = "BIV2Y"
"BIV3" = "BIV3Y"
"BIV" = "BIVY"
"BIV1_ABC" = "BIV1Y_ABC"
"BIV2_ABC" = "BIV2Y_ABC"
"BIV3_ABC" = "BIV3Y_ABC"
;
RUN;
DATA _NULL_;
LENGTH
Vorher
Nachher $20
;
Vorher = "BIV";
Nachher = PUT (Vorher, $fmtNewNames.);
PUT Vorher= Nachher=;
Vorher = "BIV1";
Nachher = PUT (Vorher, $fmtNewNames.);
PUT Vorher= Nachher=;
Vorher = "BIV2_ABC";
Nachher = PUT (Vorher, $fmtNewNames.);
PUT Vorher= Nachher=;
Vorher = "UNBEKANNT";
Nachher = PUT (Vorher, $fmtNewNames.);
PUT Vorher= Nachher=;
RUN;
/* Ausgabe im Log: */
Vorher=BIV Nachher=BIVY
Vorher=BIV1 Nachher=BIV1Y
Vorher=BIV2_ABC Nachher=BIV2Y_ABC
Vorher=UNBEKANNT Nachher=UNBEKANNT
Code für Variante 2:
/* Angenommen die Regel lautet:
- Es kommen Werte,
- die mit BIV beginnen
- und danach 0 bis 1 Ziffer haben
- und danach
- enden
- oder ein Unterstrich und weitere Zeichen folgen
- Ergänze diese Werte um den Buchstaben Y
- bei 3-stelligen Werten am Ende
- sonst nach der ersten Ziffer
*/
DATA _NULL_;
LENGTH
oPattern 8
sPattern $100
Vorher
Nachher $20
;
/* Definieren des Such- und Ersetzungsmusters */
sPattern = 's/(BIV\d?)(_?)(.*)/$1Y$2$3/';
/* Suchmuster validieren */
oPattern = PRXParse (sPattern);
Vorher = "BIV";
Nachher = PRXChange (oPattern, 1, Vorher);
PUT Vorher= Nachher=;
Vorher = "BIV_ABC";
Nachher = PRXChange (oPattern, 1, Vorher);
PUT Vorher= Nachher=;
Vorher = "BIV1";
Nachher = PRXChange (oPattern, 1, Vorher);
PUT Vorher= Nachher=;
Vorher = "BIV2ABC";
Nachher = PRXChange (oPattern, 1, Vorher);
PUT Vorher= Nachher=;
Vorher = "BIV3_ABC";
Nachher = PRXChange (oPattern, 1, Vorher);
PUT Vorher= Nachher=;
Vorher = "UNBEKANNT";
Nachher = PRXChange (oPattern, 1, Vorher);
PUT Vorher= Nachher=;
RUN;
/* Ausgabe im Log: */
Vorher=BIV Nachher=BIVY
Vorher=BIV_ABC Nachher=BIVY_ABC
Vorher=BIV1 Nachher=BIV1Y
Vorher=BIV2ABC Nachher=BIV2YABC
Vorher=BIV3_ABC Nachher=BIV3Y_ABC
Vorher=UNBEKANNT Nachher=UNBEKANNT
Viele Grüße
Andreas
hallo Fay,
mit index() kann man die Position eines Zeichens im String bestimmen.
viele Grüße. Heide
data test; length wert $20; wert = 'BIV1'; output; wert = 'BiV2'; output; wert = 'BIV3'; output; wert = 'BIV'; output; wert = 'BIV1_ABC'; output; wert = 'BIV2_ABC'; output; wert = 'BIV3_ABC'; output; run; data daten (drop=pos); set test; pos = index(wert,"_"); if pos then wert = cats(substr(wert,1,pos-1),"Y",substr(wert,pos)); else wert = cats(wert,"Y"); run;
Hallo Fay123,
die Funktion PRXChange ist dafür geeignet:
data test;
length wert $20;
wert = 'BIV1'; output;
wert = 'BiV2'; output;
wert = 'BIV3'; output;
wert = 'BIV'; output;
wert = 'BIV1_ABC'; output;
wert = 'BIV2_ABC'; output;
wert = 'BIV3_ABC'; output;
run;
Data change;
set test;
wert_neu = PRXChange("s/(BIV\d*)(.*)/\1Y\2/i",1,Wert);
run;
Viele Grüße
Jan
Vielen Dank an alle!
Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.
Register today!