- Als neu kennzeichnen
- Lesezeichen
- Abonnieren
- Stummschalten
- RSS-Feed abonnieren
- Kennzeichnen
- Anstößigen Inhalt melden
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!
- Als neu kennzeichnen
- Lesezeichen
- Abonnieren
- Stummschalten
- RSS-Feed abonnieren
- Kennzeichnen
- Anstößigen Inhalt melden
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
- Als neu kennzeichnen
- Lesezeichen
- Abonnieren
- Stummschalten
- RSS-Feed abonnieren
- Kennzeichnen
- Anstößigen Inhalt melden
Ich sehe neben einem Join mit einer externen Tabelle noch mindestens zwei weitere effektive Wege, wie die 'Umbenennung' von statten gehen kann:
- Erzeugen eines Formates, das das mapping von altem zu neuem Namen übernimmt
- Verwenden von Regular Expressions
- Diese Variante ist dann interessant, wenn es Regeln für die Umbenennung gibt
- Dann muss man nicht jeden alten und neuen Wert selbst in irgendeiner Form benennen
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
- Als neu kennzeichnen
- Lesezeichen
- Abonnieren
- Stummschalten
- RSS-Feed abonnieren
- Kennzeichnen
- Anstößigen Inhalt melden
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;
- Als neu kennzeichnen
- Lesezeichen
- Abonnieren
- Stummschalten
- RSS-Feed abonnieren
- Kennzeichnen
- Anstößigen Inhalt melden
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
- Als neu kennzeichnen
- Lesezeichen
- Abonnieren
- Stummschalten
- RSS-Feed abonnieren
- Kennzeichnen
- Anstößigen Inhalt melden
Vielen Dank an alle!