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