LesezeichenAbonnierenRSS-Feed abonnieren
Anni2017
Calcite | Level 5

Hallo Community, ich schreibe an meiner Masterarbeit und ich soll mit SAS 9.4

1. Eine Datei mit Performanceergebnissen einlesen (ID Individuum, TestType, verschiedene Variablen, TestDatum, TestLocation)

 

2. Eine Datei mit Verwandschaftsmatrix einlesen (ID Individuum, ID Vater, ID Mutter, Geburtsdatum)

    Problem:a. Die ID der Tiere enthalten tlw. characters und verschiedene delimiter -> wie lese ich solche am besten ein?

                  b. Alle AusgangsIDs sollen in rein numeric ID umgewandelt werden (dabei kommen einige IDs ja mehrfach vor und diese                           sollen natürlich nur eine neue ID bekommen), sprich alle IDs sollen nur Zahlen enhalten (einheitlich sein)

                  c. Für einige der Individuen gibt es kein Geburtsdatum, was aber vermutlich auch nicht wichtig ist, da eh nur eine                                      Teilmenge der Verwandschaftsdatei zu der Performance Datei passt

 

3. Beide Dateien sollen verbunden werden, sodass jedem Individuum aus der 1. Datei nicht nur Prüfungsergebnisse, sondern auch Verwandschaft und Geburtsdatum zugeordnet werden können und jedem Individuum (auch Mutter und Vater) aus der 2. Datei Prüfungsergebnisse zugeordnet werden können.

 

Ich habe die Performance-Datei importiert mit: 

/***Import data***/

 

DATA Anni2017.Performance;

    LENGTH

        ID                 8

        TestType         $ 1

        Conform            8

        FurScore           8

        HeightW            8

        ChestCir           8

        BoltFox            8

        Passion            8

        SoundUG            8

        SearchUG           8

        NoseApt            8

        TrackRel           8

        TrackVoli          8

        SoundTr            8

        SoundSi            8

        WaterAf            8

        Obedience          8

        Gun_Shy            8

        TotalP             8

        Price              8

        TestDate           8

        Location           $19;

      

    FORMAT

        ID                BEST12.

        TestType          $CHAR1.

        Conform           BEST12.

        FurScore          BEST12.

        HeightW           BEST12.

        ChestCir          BEST12.

        BoltFox           BEST12.

        Passion           BEST12.

        SoundUG           BEST12.

        SearchUG          BEST12.

        NoseApt           BEST12.

        TrackRel          BEST12.

        TrackVoli         BEST12.

        SoundTr           BEST12.

        SoundSi           BEST12.

        WaterAf           BEST12.

        Obedience         BEST12.

        Gun_Shy           BEST12.

        TotalP            BEST12.

        Price             BEST12.

        TestDate          DDMMYYP10.

        Location          $CHAR19.;

   

    INFORMAT

        ID                BEST12.

        TestType          $CHAR1.

        Conform           BEST12.

        FurScore          BEST12.

        HeightW           BEST12.

        ChestCir          BEST12.

        BoltFox           BEST12.

        Passion           BEST12.

        SoundUG           BEST12.

        SearchUG          BEST12.

        NoseApt           BEST12.

        TrackRel          BEST12.

        TrackVoli         BEST12.

        SoundTr           BEST12.

        SoundSi           BEST12.

        WaterAf           BEST12.

        Obedience         BEST12.

        Gun_Shy           BEST12.

        TotalP            BEST12.

        Price             BEST12.

        TestDate          DDMMYY10.

        Location          $CHAR19.;

       

    INFILE 'C:\Users\file_location'       /*file location*/

        LRECL=88

        ENCODING="WLATIN1"

        TERMSTR=CRLF

        DLM=';'

            FIRSTOBS=2

        MISSOVER

        DSD;

    INPUT

        ID                : BEST32.

        TestType          : $CHAR1.

        Conform           : BEST32.

        FurScore          : BEST32.

        HeightW           : BEST32.

        ChestCir          : BEST32.

        BoltFox           : BEST32.

        Passion           : BEST32.

        SoundUG           : BEST32.

        SearchUG          : BEST32.

        NoseApt           : BEST32.

        TrackRel          : BEST32.

        TrackVoli         : BEST32.

        SoundTr           : BEST32.

        SoundSi           : BEST32.

        WaterAf           : BEST32.

        Obedience         : BEST32.

        Gun_Shy           : BEST32.

        TotalP            : BEST32.

        Price             : BEST32.

        TestDate          : DDMMYY10.

        Location          : $CHAR19.;

       

RUN;

/***Descriptive Statistics***/ ....

 

Bei der Verwandschaftsdatei komme ich einfach nicht weiter... Hab versucht es mit dem Import Wizard als Excel-Datei einzulesen und dann mit:

PROC IMPORT OUT= VerwandschaftsMatrix 
DATAFILE= "C:\file_location.xlsx"
DBMS=EXCEL REPLACE;
RANGE="Datei$";
GETNAMES=NO;
MIXED=YES;
SCANTEXT=YES;
USEDATE=YES;

RUN;

 

laufen zu lassen. 1. fehlen dann alle ID mit characteren und 2. scheint SAS noch die Zeit mit reinzurechnen? Ich hab plötzlich 6 variablen anstelle von 4..

 

Gibt es einen relativ einfachen Weg, bei dem ich vor meinen Professoren auch noch behaupten kann ich hätte es mir selbst erarbeitet?

 

Ich bedanke mich schon mal im Voraus für alle Hilfe Anni2017

2 ANTWORTEN 2
mfab
Quartz | Level 8

Hallo @Anni2017,

 

fragen finde ich nicht verkehrt. Eine komplette Lösung im Rahmen einer Masterarbeit zu liefern hat für mich einen gewissen Beigeschmack. Daher hier ein paar generelle Hinweise von mir. Zumal mir für eine komplette "Lösung" auch einige Hinweise fehlen.

 

Zu Deinen Fragen:

ID's mit Charactern einzulesen sollte kein Problem sein. Wer sagt denn, dass eine ID immer numerisch sein muss? Oder sind in der Datei einfach die numerischen ID's plus zusätzliche irrelevante Character-Zeichen in den Feldern enthalten?

Grundsätzlich sollten die Delimiter in einer Datei natürlich klar gegeben sein. Wenn ich mir ein paar ID's in der Datei Verwandschaft anschaue, scheint es auch so zu sein, dass immer mit Semicolon getrennt ist. Leerzeichen sind ja auch nur Character-Werte und sollten bei der Angabe eines Delimiters nicht stören.

 

SAS kennt zwei Datentypen: Character und Numerisch.

Ein Datum oder eine Uhrzeit ist auch nur ein numerischer Wert, der einfach anders dargestellt wird (das erledigen die Formate).

 

Was SAS beim Import Wizard macht ist, dass die ersten paar Datensätze (z.B. die ersten 100 Datensätze) analysiert und daraufhin seinen Code generiert. Wenn in den ersten analysierten Datensätzen nur numerische Werte vorkommen geht der Wizard davon aus, dass es sich um ein numerisches Feld handelt. Wird ein Datum erkannt, wird ein entsprechendes Format für das Feld gewählt.

Hier ist also wichtig eine genaue und korrekte Felddefinition zu haben. Entweder Du hast diese in der Datenbeschreibung mitbekommen oder Du solltest die Anzahl Zeilen, die von dem Wizard analysiert werden erhöhen, damit verschiedene Fälle in den Daten entdeckt werden können. (Ich vermute Du nutzt den Enterprise Guide?)

Letztendlich ist so ein Wizard immer nur eine Hilfestellung und kann nie garantieren, dass er in Deinem speziellen Fall korrekt arbeitet. Gegebenenfalls liefert der Wizard zumindest einen ersten Code, den Du dann für Dich anpassen kannst.

 

Die Thematik der ID-Bereinigung habe ich nicht ganz verstanden. Sind manchmal nur zusätzliche Character-Zeichen enthalten, die aus den Daten entfernt werden sollen oder soll den ID's mit Charactern eine komplett neue ID zugeordnet werden?

Für alle Anforderungen gibt es (verschiedene) Lösungsmöglichkeiten.

 

Was ich auch nicht verstanden habe ist, wieso Du die Verwandschaftsdatei zunächst als Excel bearbeitet hast und dann einliest?

 

Ich würde Dir dazu raten einmal die Schritte durchzudenken und auszuformulieren. Was möchtest Du tun, bzw. was würdest Du tun, wenn Du die Bearbeitung von Hand auf Papier machen müsstest? Z.B.:

1) Einlesen der Performance-Datei

2) Einlesen der Verwandschafts-Datei

3) Überarbeiten der ID's ... (was genau?!)

4) ...

 

Dann kannst Du Dich daran machen, die geeigneten Schritte und Vorgehensweisen bei SAS zu suchen, bzw. zu erfragen.

 

Herzliche Grüße und viel Erfolg

Michael

Kurt_Bremser
Super User

Beim zweiten File würde ich genauso aus dem csv und nicht aus dem xlsx lesen. Excel-Files sind notorisch beschissen, was unvermutete Formate etc betrifft.

 

Mein Programmvorschlag fürs Einlesen:

data performance;
infile '$HOME/sascommunity/Performance_RawData.csv' dlm=';' dsd firstobs=2;
input
  ID              : BEST12.
  TestType        : $CHAR1.
  Conform         : BEST12.
  FurScore        : BEST12.
  HeightW         : BEST12.
  ChestCir        : BEST12.
  BoltFox         : BEST12.
  Passion         : BEST12.
  SoundUG         : BEST12.
  SearchUG        : BEST12.
  NoseApt         : BEST12.
  TrackRel        : BEST12.
  TrackVoli       : BEST12.
  SoundTr         : BEST12.
  SoundSi         : BEST12.
  WaterAf         : BEST12.
  Obedience       : BEST12.
  Gun_Shy         : BEST12.
  TotalP          : BEST12.
  Price           : BEST12.
  TestDate        : DDMMYY10.
  Location        : $CHAR19.
;
format TestDate ddmmyyp10.;
run;

data verwandtschaft;
infile '$HOME/sascommunity/Verwandschaft_RawData.csv' dlm=';' dsd;
input ID_c :$20. ID_V_c :$20. ID_M_c :$20. gebdat : ddmmyy10.;
format gebdat ddmmyyp10.;
run;

Das produziert bei der Verwandtschaft 5 NOTEs wegen unbrauchbarer Datumswerte.

 

Dann habe ich mir die ID in der Verwandschaftstabelle angesehen. Außer den rein numerischen ist da nichts für eine Verknüpfung zu den Performancedaten brauchbar. Die Nummern in den gemischten Feldern sind entweder zu groß oder zu klein für den Wertebereich der ID aus der Performance (mit ein paar Ausnahmen, die vielleicht passen könnten).

Ich würde daher alle nichtnumerischen vorläufig ausfiltern, die verbleibenden IDs auf numerisch konvertieren und dann mal einen Testjoin machen, um zu sehen, was dabei rauskommt.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

Diskussionsstatistiken
  • 2 Antworten
  • 1327 Aufrufe
  • 0 Kudos
  • 3 in Unterhaltung