Daten laden mit dem Paket readr

Ich wurde heute gefragt, wie man aus einer Textdatei, in welcher die Einträge in fixen Abständen vorliegen, Daten nach R importiert.

Das Problem war dabei, dass Datumsangaben und kategorielle Einträge von R bzw. RStudio nicht sofort richtig erkannt und zugeordnet wurden.

Es ging dabei um eine Datei aus dem Angebot von http://www.stat.ufl.edu/~winner/datasets.html eine gerne gebrauchten Sammlung von Testdaten zur Datenanalyse. In der Frage ging es um den Datensatz “Members and Survival of the Donner Party”.

An einem kurzer Auszug von Members and Survival of the Donner Party (Data) kann man das Problem etwas besser erkennen:

George Donner               60M              0  03/27/1847             07/19/1846        1AC
Tamsen Donner               45F              0  03/28/1847             07/19/1846        1AC
Frances Donner               6F              1                    3    07/19/1846        1AC
Georgia Donner               4F              1                    3    07/19/1846        1AC
Eliza Donner                 3F              1                    3    07/19/1846        1AC
Elitha Cumi Donner          13F              1                    1    07/19/1846        1AC
Leanna Donner               11F              1                    1    07/19/1846        1AC
Jacob Donner                56M              0  12/15/1846             07/19/1846        1AC
Elizabeth Donner            45F              0  04/01/1847             07/19/1846        1AC
George Donner II             9M              1                    1    07/19/1846        1AC

Schaut man in die Beschreibungsdatei zum Datensatz, so findet man:

Dataset:  donner.dat

Source: Kristin Johnson's killer webpage @ www.utahcrossing.org 

Description: Statistics regarding the 89 members of Donner party
1846-1847.


Variables/Columns
Name  1-27
Age   29-30
Gender   31
Survive   46   /*  1=Yes, 0=No  */
Date of death   49-58   /* mmddyyyy10.  */
rescue party   67     /*  among survivors  */
date joined party  72-81   /* mmddyyyy10. */
trapped in mountains  90  /* 1=Yes, 0=no */
camp  91-92     /* LC=Lake Camp, AC=Alden Creek  (mid december)  */

Die Daten sind also auf bestimmte Positionen einer Zeile verteilt und haben zum Teil kategoriellen Charakter (wie z.B. Survive und camp), aber auch Datumsangaben sind dort hinterlegt (Date of death und date joined party).

Will man diese Datei korrekt in R laden, so geht dies recht schön mit dem Paket readr. Nachdem man dieses ggf. installiert hat schreibt man einfach:

library(readr)
daten <- read_fwf("http://www.stat.ufl.edu/~winner/data/donner.dat", 
                  fwf_positions(
                      c( 1, 29,  31, 46, 49, 67, 72, 90, 91), 
                      c(27, 30,  31, 46, 58, 67, 81 ,90, 92), 
                      c("Name", "Age",    "Gender", "Survive", "DateOfDeath", "RescueParty", "DateJoinedParty", "TrappedInMountains",  "Camp")
                  ),
                  col_types = cols(
                    Name = col_character(),
                    Age = col_integer(),
                    Gender = col_factor(c("M", "F")),
                    Survive = col_factor(c("0", "1")),
                    DateOfDeath = col_date(format = "%m/%d/%Y"),
                    RescueParty = col_integer(),
                    DateJoinedParty = col_date(format = "%m/%d/%Y"),
                    TrappedInMountains = col_factor(c("0", "1")),
                    Camp = col_factor(c("LC", "AC"))
                  )
                )

Will man die Faktoren noch in griffige Begriffe umwandeln kann man folgendes anfügen:

# Ändern der numerischen Faktoren in griffige Wörter:
levels(daten$Survive) <- c("Yes", "No")
levels(daten$TrappedInMountains) <- c("Yes", "No")
levels(daten$Gender) <- c("Male", "Female")

Man erhält damit dann:

> head(daten, 8)
# A tibble: 8 × 9
                Name   Age Gender Survive DateOfDeath RescueParty DateJoinedParty TrappedInMountains   Camp
               <chr> <int> <fctr>  <fctr>      <date>       <int>          <date>             <fctr> <fctr>
1      George Donner    60   Male     Yes  1847-03-27          NA      1846-07-19                 No     AC
2      Tamsen Donner    45 Female     Yes  1847-03-28          NA      1846-07-19                 No     AC
3     Frances Donner     6 Female      No        <NA>           3      1846-07-19                 No     AC
4     Georgia Donner     4 Female      No        <NA>           3      1846-07-19                 No     AC
5       Eliza Donner     3 Female      No        <NA>           3      1846-07-19                 No     AC
6 Elitha Cumi Donner    13 Female      No        <NA>           1      1846-07-19                 No     AC
7      Leanna Donner    11 Female      No        <NA>           1      1846-07-19                 No     AC
8       Jacob Donner    56   Male     Yes  1846-12-15          NA      1846-07-19                 No     AC
comments powered by Disqus