Zeichen abscheiden???

Ähnliche Dokumente
Jede Kombination von 7 Spalten erzeugen

Mehrere Datensätze zu einem Datensatz zusammenführen

Hallo Jessi, wenn ich das. DATA aufg3_b; vari='<.0001'; IF &wil_two_test. le vari THEN pwert=0.0001;

Spalten aufsummieren?!

SUBSTRING - wo liegt mein Fehler?

Ansprechen einer Anzahl von Variablen über einen Schleifendurchlauf

Eine Variable in mehrere aufteilen

Wie kann ich die Ausgabe als Excel speichern?

Daten aus SPSS-18 Proc Format...

Anhang zur Frage Data statement und Proc Statement

Import von Text-Dateien. Einzelne Wörter einlesen.

Merge mit nicht eindeutigen by-variablen

zusammenfassen von Text variablenin einer Variable bei unterschiedlicher Variablenanzahl

Zeilen in SAS-Datensatz einfügen

IMPORT / EXPORT Access

Vollständigen Code. News Artikel Foren Projekte Links Über Redscope. Join List Random Previous Next

Änderung der Ordnung der Variablen in den SAS Datensatz

ODS RTF Titel in Spalten linksbündig darstellen

Formatierung beim Einlesen

SAS BASE LOG Fragen. Antwort, Teil 1

QMF Tabelle Q.OBJECT_DATA in DB2

Funktion: Tabelleninhalte nacheinander durch eine Funktion schicken

Wie überprüfen, ob eine Datei existiert?

Einlesen von Textdateien mit sehr langen Zeilen

Erzeugung von Zufallszahlen mit RANUNI()

Dateien trennen und zusammenfügen

Alter berechnen mit Base SAS

Zeit-Macro-Variablen, passend zu einem Tag

Kreuztabelle als Data-Set so wie aus proc tabulate

Allman-Einrückungsstil versus 1TBS bei SAS-Base-Programmen

Übersicht Shell-Scripten

Macro erzeugt Dateifilter

Datensatz aus Datensatz erzeugen

Umbenennung von Spaltennamen über Schleife(n)

News Artikel Foren Projekte Links Über Redscope

viele ähnliche Datensätze automatisch einlesen

Berechnung der Arbeitstage

SAS-Tipp #6: Schneller als Proc Summary

SPDS-Problem - proc summary auf View mit by-variable - Sortierung wird verlangt

Dateneingabe und Transformation Übersicht

Hilfe bei Programmierung mit SAS

Berechnung der Dauer eines SAS Makros?

SAS Format: Fallen und Tricks

2.2 Einfache Datenstrukturen

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

01 Einführung in PHP. Einführung in PHP 1/13 PHP in Aktion

THEMA: SAS CERTIFIED BASE PROGRAMMER FOR SAS 9 DIE VORBEREITUNG BRINGT S! KARIN GROSS

News Artikel Foren Projekte Links Über Redscope

STATA II: Daten- und Analysevorbereitung (Teil 1)

News Artikel Foren Projekte Links Über Redscope

Übungsblatt 1. Java Vorkurs (WS 2017)

Auslesen von SAS Systeminformationen über die aktuelle Log- Ausgabe

Python Intro. Vorsemesterkurs Informatik Praktischer Teil WS2012/13. 2.Oktober Vorkurs Informatik - WS 2012/13

Funktionen in JavaScript

Exportieren in excel sheets

Python Intro I. Vorsemesterkurs Informatik Praktischer Teil WS 2013/14. 1.Oktober Vorkurs Informatik - WS 2013/14

06 While-Schleifen. While-Schleifen 1/7 Wiederholung: Schleifen

Dynamisch Makros aufrufen

Excel sheet input / Zufallsgenerator/ Excel sheet output

Ein Array ist eine Liste mit Einträgen, fast wie eine Einkaufsliste. Man kann darin also mehr als einen Eintrag in eine einzige Variable speichern.

pue02 October 28, 2016

GI Vektoren

Kalenderfrage zu Ostern

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

Greenfoot: Verzweigungen

Ermittlung der übereinstimmenden Variablen (-Namen) zweier Datasets

Programmiertechnik 1 FOR-SCHLEIFEN

Shell-Scripting Linux-Kurs der Unix-AG

Grundlagen der Programmierung

Funktionen in JavaScript

Greenfoot: Verzweigungen Nicolas Ruh und Dieter Koch

Programmiertechnik 1 FOR-SCHLEIFEN

Funktionen nur wenn dann

Informatik I Übung, Woche 40

Aufgabe Total Punkte

Makrofunktion zur Übernahme von Abfragekriterien aus externen Quellen, z.b. einer Excel Datei, in SAS Code (PROC SQL)

05 For-Schleifen. For-Schleifen 1/7 Was ist eine Schleife?

NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL

PROC GCHART HBAR Zeilenumbruch in Achsenbeschriftung

Java Übung. Übung 2. Werner Gaulke. 19. April Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Datenbank und Tabelle mit SQL erstellen

SAS-Online Dokumentation: zu finden über Internetsuche nach sas online documentation

rechtsbündige Leerzeichen mit einlesen im Datastep

Verwenden Sie für jede Aufgabe die C++ IDE von Eclipse (pro Aufgabe ein Projekt).

EG 4.2: Pfade zu verlinkten SAS-Files als relative Pfade speichern!?

Tag 2 Repetitorium Informatik (Java)

Failed to transcode data from U_UTF8_CE to U_LATIN9_CE?!

Fehlermeldung, wenn Anzahl der %do der %end entspricht - was läuft falsch?

Shell-Scripting Linux-Kurs der Unix-AG

hue12 January 24, 2017

Strings. 3 Stringvergleiche Realisieren Sie bitte folgendes Programm: AnPr

Eine kleine Befehlssammlung für Java Teil1

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Computer & GNU/Linux Einführung Teil 4

Informatik. Wiederholung Felder (Arrays), string. Vorlesung

Informatik Repetitorium SS Volker Jaedicke

Bash-Skripting Linux-Kurs der Unix-AG

ÜBUNG 3 ZUR EINFÜHRUNG IN DIE PROGRAMMIERUNG FÜR COMPUTERLINGUISTEN LEONIE WEIßWEILER

Informatik für Schüler, Foliensatz 18 Rekursion

Transkript:

News Artikel Foren Projekte Links Über Redscope Join List Random Previous Next Startseite Foren Allgemeine Fragen zu SAS Zeichen abscheiden??? 10 June, 2012-15:14 kate24 Hallo, hier eine wohl sehr einfache Frage - aber als SAS-Anfänger bin ich leider auch mit googeln nicht weitergekommen: Folgendes Problem: Ich habe eine Variable namens "EMA", die die Ergebnisse für einen bestimmten Bluttest enthält. Die Daten stammen von verschiedenen Laboren, die die Ergebnisse je nach Messverfahren unterschiedlich angeben. Folgende Ergebnisse wurden für diese Variable "EMA" meistens eingetragen: 1:160 1:5 1:40 1:120 1:2.5 etc. (Info: Ab einem Wert von 1:10 sind die Ergebnisse positiv, bei 1:5 etc. negativ). Für diese Form der Ergebnisse würde ich einfach die ersten zwei Stellen abschneiden wollen (also immer "1:" rauslöschen), leider habe ich dafür keinen Befehl gefunden, mit dem ich etas anfangen konnte. Es gibt aber noch ein Problem, dass das Ganze sowieso verkompliziert, da leider manche Labore folgende Ergebnisse eingetragen haben: negative positive neg pos - + +++ (das waren bislang die hauptsächlichen "Ausreißer") Wer hat eine Idee, wie ich daraus eine neue Variable erstellen kann, die nur noch "0" für negative Ergebnisse und "1" für positive Ergebnisse enthält? Meine Idee wäre eine neue Variable zu erstellen und dazu SAS folgende Anweisungen zu geben: Wenn "EMA" mit '1:' beginnt: die ersten beiden Zeichen abschneiden UND falls die übrige Zahl größer/gleich 10 ist, eine '1' reinschreiben, sonst eine '0'. Wenn "EMA" NICHT mit '1:' beginnt UND dafür aber irgendwo ein 'neg' (oder '-') steht, wird in die neue Variable '0' reingeschrieben; Wenn "EMA" nicht mit '1' beginnt UND dafür aber irgendwo ein 'pos' (oder'+') steht, wird eine '1' in die neue Variable reingeschrieben. Leider hab ich nur sehr lückenhaft eine Vorstellung davon, wie man dazu eine Syntax schreibt (naja, if then else ist mir schon geläufig). Womöglich gibt es auch eine ganz andere Lösung. Da man sowas im Standard-SAS-Kurs an der Uni leider wieder nicht durchgenommen hat und ich niemanden hier habe, der mir helfen kann, bin ich sehr dankbar für eure Antworten! Kathi Foren: Allgemeine Fragen zu SAS

Vorschlag hier mein Vorschlag: 11 June, 2012-10:02 HansKneilmann data TestDaten; length EMA $10; EMA="1:160"; output; EMA="1:5"; output; EMA="1:40"; output; EMA="1:120"; output; EMA="1:2.5"; output; EMA="negative"; output; EMA="positive"; output; EMA="neg"; output; EMA="pos"; output; EMA="-"; output; EMA="+"; output; EMA="+++"; output; data aaa; set TestDaten; if EMA =: "1:" then do; /* mit colon operator, für implizites substr bei der if-bed. */ EMA2=input(substr(EMA,3), 10.); /* erst abschneiden,dann Char nach Int umwandeln */ end; if EMA2 ge 10 then EMA3=1; /* Wenn Zahl groß genug, dann gut */ else if EMA IN: ('+', 'pos') then EMA3=1; /* oder wenn 'guter' Text, dann auch gut */ else EMA3=0; /* wenn nicht, dann nicht gut */ /* Info: das IN ist auch mit colon operator, f.implizites substr */ proc print; Viel Erfolg! klappt noch nicht so ganz Hallo Hans, 12 June, 2012-16:50 kate24 vielen Dank für den Vorschlag! Habe Ihre Syntax entsprechend meiner Daten abgeändert bzw. ergänzt und SAS mach immerhin schon mal was. Aber das mit iga_emaval2 funktioniert noch nicht so ganz. Wenn ich mir iga_emaval, iga_emaval2 und iga_emaval3 ausgeben lasse, erhalte ich folgendes: Beob. emaval emaval2 emaval3 1 +/-1:2.5. 1 2 1:2.5. 0 3 1:5. 0 4 1:10. 0 5 1:20. 0 6 1:40. 0 7 1:80. 0 8 1:120. 0 9 1:160. 0 10 1:320. 0 11 1:640. 0 12 1:1280. 0 13 1:10240. 0 14 negative. 0 15 positive. 1 16 negat. 0 17 posit. 1 18 neg. 0 19 pos. 1

20 -. 0 21 +. 1 22 ++. 1 23 +++. 1 Eigentlich müsste in iga_emaval2 doch was drin stehen? Und wieso ist iga_emaval3 für die Werte wie z.b. 1:160 noch 0, da müsste doch dann eigentlich eine 1 stehen? Wäre super, wenn Sie mir da nochmal helfen könnten... Vielen Dank! Kathi data base; length EMA $10; iga_emaval="+/-1:2.5"; output; iga_emaval="1:2.5"; output; iga_emaval="1:5"; output; iga_emaval="1:10"; output; iga_emaval="1:20"; output; iga_emaval="1:40"; output; iga_emaval="1:80"; output; iga_emaval="1:120"; output; iga_emaval="1:160"; output; iga_emaval="1:320"; output; iga_emaval="1:640"; output; iga_emaval="1:1280"; output; iga_emaval="1:10240"; output; iga_emaval="negative"; output; iga_emaval="positive"; output; iga_emaval="negat"; output; iga_emaval="posit"; output; iga_emaval="neg"; output; iga_emaval="pos"; output; iga_emaval="-"; output; iga_emaval="+"; output; iga_emaval="++"; output; iga_emaval="+++"; output; data ema; set base; if iga_emaval =: "1:" then do; /* mit colon operator, für implizites substr bei der if-bed. */ iga_emaval2=input(substr(ema,3), 10.); /* erst abschneiden,dann Char nach Int umwandeln */ end; if iga_emaval2 >=10 then iga_emaval3=1; /* Wenn Zahl groß genug, dann gut */ else if iga_emaval IN: ('+','++','+++','mild pozit','pos','posit','positive',) then iga_emaval3=1; /* oder wenn 'guter' Text, dann auch gut */ else iga_emaval3=0; /* wenn nicht, dann nicht gut */ /* Info: das IN ist auch mit colon operator, f.implizites substr */ proc print; proc print data=ema; var iga_emaval iga_emaval2 iga_emaval3; Hallo kate24, so auf die Hallo kate24, so auf die schnelle sehe ich zwei Fehler: 12 June, 2012-17:16 Frederik_Bloch 1) erstellst du in deiner Beispieltabelle die Variable EMA und lässt diese leer und befüllst eine zweite iga_emaval. Im zweiten Data Step befüllst du dann die Variable iga_emaval2 mit einem Substring aus der leeren EMA-Variable, die natürlich immer leer ist. Da musst du auch auf iga_emval gehen wie in der IF-Anweisung. 2) ist bei der Bedingung iga_emaval IN: ('+','++','+++','mild pozit','pos','posit','positive',) hinten ein Komma zu viel. Frederik

... schon besser! Danke Frederik! 12 June, 2012-17:51 kate24 ich dachte ich hätte alles mit dem eigentlichen Variablennamen ersetzt, da war ich mal wieder mit Blindheit geschlagen. Aber eines funktioniert leider immer noch nicht: wenn ich mit proc print oder proc freq überprüfe, werden immer nur 22 Beobachtungen ausgegeben, dabei sind in der aktuellen Datenbank insgesamt 84 (davon sind 4 missing). Woran kann das liegen? Die verschiedenen Ausprägungen '+' etc. habe ich nochmal überprüft, die habe ich alle für die "positiven" Werte aufgeführt... Nochmal danke! lg, kathi colon operator 13 June, 2012-07:54 HansKneilmann der colon operator arbeitet als ob er intern eine substr-funktion hätte, er sorgt dafür, dass links und rechts beim Vergleich immer gleich lange Strings stehen! Hier else if iga_emaval IN: ('+','++','+++','mild pozit','pos','posit','positive',) then iga_emaval3=1; ist einiges doppelt, denn es wird der colon operator verwendet! So ist es richtig: else if iga_emaval IN: ('+','mild pozit','pos') then iga_emaval3=1; Erklärung: 'pos','posit','positive' beginnen alle mit den gleichen drei Zeichen 'pos', also reicht 'pos', genauso bei '+','++','+++', Auch die beginnen alle mit dem Zeichen '+', deshalb reicht '+'. Ohne den colon operator müsste es so aussehen: else if iga_emaval IN ('+','++','+++','mild pozit','pos') then iga_emaval3=1; Zu der Frage mit den nur 22 Beobachtungen: Ohne den log kann man (bzw. ich) schlecht etwas dazu sagen. log Hallo Hans, 13 June, 2012-09:30 kate24 danke für die ausführliche Info zum colon operator! Was mir aufgefallen ist: also es sind jetzt immer 23 Beobachtungen die ausgegeben werden, und genausoviele Ausprägungen der Variable gibt es (also wenn man alle Möglichkeiten von 1:2.5, 1:5,..., pos, positive... zählt, sind es 23). Kann das Zufall sein? Im Log steht folgendes:

2959 data base; 2960 length iga_emaval $10; 2961 iga_emaval="+/-1:2.5"; output; 2962 iga_emaval="1:2.5"; output; 2963 iga_emaval="1:5"; output; 2964 iga_emaval="1:10"; output; 2965 iga_emaval="1:20"; output; 2966 iga_emaval="1:40"; output; 2967 iga_emaval="1:80"; output; 2968 iga_emaval="1:120"; output; 2969 iga_emaval="1:160"; output; 2970 iga_emaval="1:320"; output; 2971 iga_emaval="1:640"; output; 2972 iga_emaval="1:1280"; output; 2973 iga_emaval="1:10240"; output; 2974 iga_emaval="negative"; output; 2975 iga_emaval="positive"; output; 2976 iga_emaval="negat"; output; 2977 iga_emaval="posit"; output; 2978 iga_emaval="neg"; output; 2979 iga_emaval="pos"; output; 2980 iga_emaval="-"; output; 2981 iga_emaval="+"; output; 2982 iga_emaval="++"; output; 2983 iga_emaval="+++"; output; 2984 HINWEIS: The data set WORK.BASE has 23 observations and 1 va HINWEIS: DATA-Anweisung benötigt. (Gesamtverarbeitungszeit): 0.03 Sekunden 2985 data ema; 2986 set base; 2987 if iga_emaval =: "1:" then do; * m 2987! substr bei der if-bed; 2988 iga_emaval2=input(substr(iga_emaval,3), 10.); 2988! Int umwandeln; 2989 end; 2990 if iga_emaval2 >=10 then iga_emaval3=1; 2991 else if iga_emaval IN: ('+','mild pozit','pos') then 2991! Text, dann auch gut; 2992 else iga_emaval3=0; *we 2993 HINWEIS: 23Es wurden Beobachtungen aus der Datei WORK.BASE. HINWEIS: The data set WORK.EMA has 23 observations and 3 var HINWEIS: DATA-Anweisung benötigt. (Gesamtverarbeitungszeit): 0.01 Sekunden 2993! *Info: das I 2993! f.implizites substr; 2994 proc print; HINWEIS: 23Es wurden Beobachtungen aus der Datei WORK.EMA. HINWEIS: PROZEDUR PRINT benötigt. (Gesamtverarbeitungszeit): 2995 proc print data=ema; 2996 var iga_emaval iga_emaval2 iga_emaval3; 2997 HINWEIS: 23Es wurden Beobachtungen aus der Datei WORK.EMA. HINWEIS: PROZEDUR PRINT benötigt. (Gesamtverarbeitungszeit):

Was auch noch seltsam ist: wenn ich die Syntax, die schon unter dem Teil mit der EMA-Synthax steht und bei der keine Variablen mit EMA enthalten sind, auch laufen lasse, erkennt SAS plötzlich die Variablen nicht mehr. Wenn ich den EMA-Teil "Aussterne", klappt es wieder. Woran kann das liegen, an der Zuordnung zu "data base"? Nochmal vielen Dank für die tolle Hilfe! Kathi Kein Zufall Du schreibst: 15 June, 2012-10:20 HansKneilmann Was mir aufgefallen ist: also es sind jetzt immer 23 Beobachtungen die ausgegeben werden, und genausoviele Ausprägungen der Variable gibt es (also wenn man alle Möglichkeiten von 1:2.5, 1:5,..., pos, positive... zählt, sind es 23). und fragst dann: Kann das Zufall sein? Antwort: Nein, kein Zufall! Es ist Dein Programm, das bestimmt dass es genau so ist! Da in Deinem Programm bzw. in dem Data Step data ema; set base;... weder Datensätze zusammengefasst (verdichte) noch ausgelassen werden hast Du immer den Effekt Anzahl Eingabe-Beobachtungen gleich Anzahl Ausgabe-Beobachtungen. Oder habe ich Dein Problem nicht/falsch verstanden??? Was meinst Du mit Deiner zweiten Frage? Was meinst Du hiermit: Was auch noch seltsam ist: wenn ich die Syntax, die schon unter dem Teil mit der EMA-Synthax steht und bei der keine Variablen mit EMA enthalten sind, auch laufen lasse, erkennt SAS plötzlich die Variablen nicht mehr. Wenn ich den EMA-Teil "Aussterne", klappt es wieder. Woran kann das liegen, an der Zuordnung zu "data base"? Wo genau ist Dein Problem? Hallo Hans, danke dass Du Hallo Hans, 15 June, 2012-10:56 kate24 danke dass Du Dich nochmal meldest! Also das Problem ist: eigentlich sind es 84 Beobachtungen und die haben für die Variable iga_emaval 23 verschiedene Ausprägungen (die Ausprägungen wiederholen sich ja, also es gibt z.b. 5 Patienten mit der Antwort "+" in iga_emaval). Wenn ich die Syntax, die Du mir zu EMA geschickt hast, laufen lasse, erhalte ich aber z.b. bei Ausgabe über proc print oder wenn ich mir mit proc freq eine 4-felder-tafel ausgeben lasse nur noch 23 Beobachtungen und nicht die vollen 84 (bei vorangegangenen Auswertungen war das kein Problem, da wurden immer 84 Beobachtungen ausgelesen).

Außerdem geht die Syntax nach "EMA" weiter mit der Auswertung ganz anderer Variablen, die eigentlich mit dem hier behandelten Problem nichts zu tun haben. Wenn ich die EMA-Syntax mitlaufen lasse, gibt SAS mir für die Auswertung der nachfolgenden Variablen aber plötzlich eine Fehlermeldung, nämlich dass er die besagten Variablen plötzlich nicht mehr kennt. Vor Einfügen der EMA-Syntax hat es aber schon geklappt (bzw. klappt auch wenn ich die "EMA"-Syntax aussterne und nochmal alles laufen lasse). Sorry dass ich das hier so umständlich schreibe, ich bin wiegesagt noch blutiger Anfänger... Code mit Log 18 June, 2012-09:08 HansKneilmann dazu kann ich Dir nichts sagen, ohne den Code und den Log dazu zu kennen. Kopier beides hier rein, dann schauen wir weiter.