R Data I/O

Der Umgang mit Daten ist in R sehr flexibel im Vergleich zu anderen Statistikpaketen. Daten sind Objekte. Mehrere Datenobjekte, auch verschiedener Art sind parallel benutzbar. Daten können im Programmcode erzeugt und sofort verwendet werden.

Daten können 'on the fly' generiert werden.

Daten können das Ergebnis von Berechnungen sein, die direkt weiter verwendet werden können.

Der in vielen Statistikpaketen üblichen Datenmatrix entspricht in R der DataFrame. Ein DataFrame ist eine zweidimensionale Tabelle. Nach den üblichen Konventionen entsprechen die Zeilen den Beobachtungen (Versuchspersonen) und die Spalten den Variablen. Die Spalten haben Namen. Über diese Namen kann man die Spalten ansprechen. In R kann man sehr flexibel auf Teile der Datenmatrix zugreifen.

Proprietäres Datenformat von R, das mit der Endung .RData abgelegt wird. Enthält alle Datensätze einer R-Sitzung inklusive Ergebnisobjekte von Berechnungen wie auch Definitionen.

Zum Datenaustausch bieten sich aus Kompatibilitätsgründen mit anderen Statistikprogrammen in Dateien gespeicherte Dataframes an. Konvention (in dieser Veranstaltung): Dataframe als Textdatei, Tab-delimited (Tabulatorzeichen trennen auf einer Zeile die Daten (Variablenwerte oder Variablennamen in der ersten Zeile) voneinander), Punkte als Dezimaltrenner, Codierung UTF-8.

Datenquellen und -eingabe

Häufig externe Datenquellen.

Eingabe, z. B. bei papiergebundenen Fragebogen

Datenfiles Textformat lesen

R-Commander

Syntax

Mit read.table() ist der Einlesebefehl für tabellenartige Daten aus externen Dateien. Es gibt viele Parameter, die einen sehr flexiblen Umgang mit den einzulesenden Dateien ermöglichen. Hinter einigen Befehle zum Einlesen von Daten verstecken sich read.table() Aufrufe. Beispielsweise liest read.delim() Textdaten ein, bei denen die Variablennamen in der ersten Zeile stehen und in denen das Tabulatorzeichen als Trennzeichen verwendet wird. Ein weiteres, gängiges Textformat ist das von Excel favorisierte 'csv'-Format, das mit read.csv() gelesen werden kann. Für das Dezimaltrennzeichen ',' als Voreinstellung gibt es für die beiden obigen Einlese-Befehle die Varianten read.delim2() bzw. read.csv2.

Datenfiles einlesen über URL

R kann Dateien direkt aus dem Internet abholen.

Beispiel: Daten über Größe, Gewicht und Intensität des Attraktivitätsvergleichs Näheres zu Beispiel unter transformation

# read data frame from url with defaults: tab delimited, names in header,
# decimal separator '.'  this is the most transparent way to read and share
# data with others
bmi <- read.delim("http://r.psych.bio.uni-goettingen.de/mv/data/virt/v_bmi.txt")
# in countries with ',' as decimal separator there is a version that
# defaults to sep=','
bmi_comma <- read.delim2("http://r.psych.bio.uni-goettingen.de/mv/data/virt/v_bmi_comma.txt")
# get the first 5 lines to control
bmi[1:5, ]
##   nr    name height weight grade c_phys_app c_good_way c_dress c_bad_way
## 1  1   Meier    180     60  2.02          2          1       2         4
## 2  2  Müller    176     54  1.00          3          4       3         1
## 3  3  Strauß    180    110  2.03          5          5       5         1
## 4  4 Übeling    182     52  1.00          4          5       4         2
## 5  5   Ärger    160     62  1.00          3          2       2         4
##   c_figure
## 1        1
## 2        5
## 3        5
## 4        3
## 5        1
plot(bmi$height, bmi$weight)

plot of chunk unnamed-chunk-1

Lokal gespeicherte Datenfiles einlesen

Am besten funktioniert das, wenn das Arbeitsverzeichnis korrekt eingestellt ist und die Datendateien im aktuellen Arbeitsverzeichnis liegen.

Arbeitsverzeichnis erfragen /Users/pzezula/lehre/lehre_ss_2014/units/io mit getwd() (get working directory). Arbeitsverzeichnis setzen mit setwd() (set working directory).

Pfade unter Unix und Mac-OS: Die einzelnen Pfad-Komponenten werden durch '/' voneinander getrennt. Nach dem Anmelden am System befindet man sich normalerweise in seinem persönlichen Verzeichnis. Angenommen, der aktuelle Benutzername ist im Folgenden 'psycho'. Dort liegt auch das voreingestellte R-Arbeitsverzeichnis. Bei Linux findet sich das normalerweise unter /home/psycho. Unter Mac OS-X ist das /Users/psycho Unter Windows ist das der sog. Benutzerordner auf dem Systemlaufwerk, meist C:. Bei Windows 7 wäre das dann auf vielen Systemen C:\Users\psycho. Im GöNet gelten für die studentischen Benutzer andere Konventionen.

Bei Pfadangaben in R wird immer der '/' als Trenner zwischen den Pfadkomponenten genutzt, also auch unter Windows. Eine R-Pfadangabe zum Setzen des Arbeitsverzeichnisses für das Windows-Verzeichnis C:\Users\psycho\Desktop würde beispielsweise unter Windows gesetzt mit setwd("C:/Users/psycho/Desktop")

Den aktuellen D

Vergleiche die Ausführungen unter basics und dort zu Pfadangaben und Arbeitsverzeichnis.

Angenommen, ein Benutzer hat die Datei v_bmi.txt, die oben erwähnt wurde, lokal in seinem Benutzerverzeichnis auf dem Desktop in einem Verzeichnis 'mv' gespeichert.

Betriebssystemunabhängiger Zugriff

# get users home directory and use it to set working directory to directory
# 'mv' on local desktop
filename <- file.path("~", "Desktop/mv", "v_bmi.txt")
read.delim(filename, fileEncoding = "UTF-8")
##    nr     name height weight grade c_phys_app c_good_way c_dress c_bad_way
## 1   1    Meier    180     60  2.02          2          1       2         4
## 2   2   Müller    176     54  1.00          3          4       3         1
## 3   3   Strauß    180    110  2.03          5          5       5         1
## 4   4  Übeling    182     52  1.00          4          5       4         2
## 5   5    Ärger    160     62  1.00          3          2       2         4
## 6   6    Östro    156     41  1.00          3          4       3         3
## 7   7 Valentin    165     71  2.47          4          3       4         2
## 8   8  Marquéz    160     70  2.37          4          4       4         2
## 9   9    Lully    159     44  2.26          4          3       3         2
## 10 10  Lumière    189     60  1.21          5          4       5         1
## 11 11   Bâtist    158     45  1.27          2          2       2         4
## 12 12  Русский    192    130  2.97          4          4       5         1
## 13 13  Berking    187     91  1.87          3          4       3         2
## 14 14   Møllar    193     86  1.62          2          2       1         5
## 15 15 Abdullah    173     56  1.00          1          2       1         5
## 16 16    Grimm    165     47  2.06          3          2       3         4
## 17 17 Guevarra    167     52  1.00          2          1       1         5
## 18 18    Panik    175     53  1.00          4          3       3         2
## 19 19 Ütülümek    180     90  1.00          3          4       4         2
## 20 20 Chorvátč    177     80  3.24          4          3       5         1
## 21 21   článku    179     90  1.00          3          5       4         2
## 22 22   Eiland    182    100  1.60          5          5       5         1
## 23 23   Kromer    178     60  1.60          1          1       1         5
## 24 24   Brauer    181     75  1.30          2          1       3         5
## 25 25 Büstisch    185     80  1.62          1          2       1         4
## 26 26 Тыва дыл    180     54  2.48          4          5       5         1
## 27 27    Compu    184     58  1.00          3          4       3         2
## 28 28   Messer    179     57  1.00          3          3       4         1
## 29 29   Miller    183     53  1.00          5          5       4         1
## 30 30 Terminal    162     54  2.15          2          1       1         4
##    c_figure
## 1         1
## 2         5
## 3         5
## 4         3
## 5         1
## 6         4
## 7         3
## 8         4
## 9         4
## 10        4
## 11        2
## 12        3
## 13        5
## 14        1
## 15        2
## 16        1
## 17        3
## 18        4
## 19        3
## 20        4
## 21        4
## 22        4
## 23        1
## 24        2
## 25        2
## 26        5
## 27        3
## 28        5
## 29        5
## 30        1

Das Arbeitsverzeichnis soll auf dieses Verzeichnis gesetzt werden. Die Datei soll in R eingelesen werden.

# get users home directory and use it to set working directory to directory
# 'mv' on local desktop
setw
## Error: Objekt 'setw' nicht gefunden
s1 <- "nie"
s2 <- "mals"
paste(s1, s2, sep = "-")
## [1] "nie-mals"

Encoding Probleme bei Textdateien

Gute Editoren machen beim Öffnen von Textdateien meist ein 'best guess', d. h. sie versuchen über das Auftreten von bestimmten Byte-Folgen und und -Nummern, deren relative Auftretenshäufigkeiten etc herauszufinden, welches Encoding vermutlich beim erstellen der Textdatei verwendet wurde. Häufig bieten sie das Wiedereinlesen einer Datei unter Verwendung eines bestimmten Encodings an. Außerdem bieten sie häufig Möglichkeiten, Textfiles in einem bestimmten Encoding-Format abzuspeichern.

Gute Editoren bieten flexible und mächtige Such- und Ersetzfunktionen. Solche Operationen können oft auf den aktuell markierten Teil eines Textes eingeschränkt werden. Einbezug von Sonderzeichen über Escape-Sequenzen.

Das Encoding kann beim Einlesen in R über den Parameter “fileEncoding” festgelegt werden. Hierdurch erfolgt eine automatische Konvertierung der Daten. Eine Auswahl möglicher Werte hierbei:

“UTF-8” “ISO-8859-1” (latin-1) “MACROMAN” (Mac OS)

Eine Liste der unterstützten Encodings findet sich u. a. in R-Studio unter File | reopen with encoding oder in R mit dem Kommando iconvlist()

# read data frame from url with defaults tab delimited, names in header,
# decimal separator '.'  convert coding on the fly
stud <- read.delim("http://r.psych.bio.uni-goettingen.de/mv/data/div/stud_utf8.txt", 
    fileEncoding = "UTF-8")
# get the first 5 lines to control
stud[1:5, ]
##   no height shoe_size weight gender birth_month birth_year
## 1  1    177      43.0     75      1           3         88
## 2  2    190      45.0     87      2           6         83
## 3  3    162      37.0     49      1           1         89
## 4  4    179      42.5     80      2           6         85
## 5  5    178      39.0     52      1           7         85
##   statistics_grade abitur math_intense academic_background
## 1              3.0    1.6            0                   1
## 2              4.0    3.7            0                   1
## 3              3.2    2.1            0                   0
## 4              3.0    2.0            1                   1
## 5              2.7    2.2            0                   1
##   computer_knowledge    string
## 1                  7      grün
## 2                  5      groß
## 3                  4       öde
## 4                  5       süß
## 5                  2 ärgerlich
plot(stud$height, stud$weight)
stud <- read.delim("http://r.psych.bio.uni-goettingen.de/mv/data/div/stud_latin1.txt", 
    fileEncoding = "LATIN1")
# sometimes there are different names for the same encoding
stud <- read.delim("http://r.psych.bio.uni-goettingen.de/mv/data/div/stud_latin1.txt", 
    fileEncoding = "ISO-8859-1")
stud <- read.delim("http://r.psych.bio.uni-goettingen.de/mv/data/div/stud_macroman.txt", 
    fileEncoding = "MACROMAN")
# get the first 5 lines to control
stud[1:5, ]
##   no height shoe_size weight gender birth_month birth_year
## 1  1    177      43.0     75      1           3         88
## 2  2    190      45.0     87      2           6         83
## 3  3    162      37.0     49      1           1         89
## 4  4    179      42.5     80      2           6         85
## 5  5    178      39.0     52      1           7         85
##   statistics_grade abitur math_intense academic_background
## 1              3.0    1.6            0                   1
## 2              4.0    3.7            0                   1
## 3              3.2    2.1            0                   0
## 4              3.0    2.0            1                   1
## 5              2.7    2.2            0                   1
##   computer_knowledge    string
## 1                  7      grün
## 2                  5      groß
## 3                  4       öde
## 4                  5       süß
## 5                  2 ärgerlich
plot(stud$height, stud$weight)

plot of chunk unnamed-chunk-4

Einlesen von Fremdformaten

R kann neben seinem eigenen Format (Rdata) und Textdaten verschiedene proprietäre Fremdformate einlesen. In Auswertungen gängige Formate sind beispielsweise Excel, SPSS, Stata usw.

SPSS-Dateien

Das portable Format wird empfohlen. Es gibt limitierte Unterstützung des 'sav'-Formats.

Mit Library foreign

# if not already done: install.packages('Hmisc')
library(foreign)
# ?read.spss
stud <- read.spss("http://r.psych.bio.uni-goettingen.de/mv/data/div/stud.sav", 
    to.data.frame = T)
## Warning:
## /var/folders/48/0jqjz26j77z07cdw__8t36rc0000gn/T//RtmpYdUrYA/filec3663f6bf483:
## Unrecognized record type 7, subtype 18 encountered in system file
## re-encoding from UTF-8

Etwas mächtiger mit Library memisc, aber ohne URL als Input-Möglichkeit.

# if not done already: install.packages('memisc')
library("memisc")
## Loading required package: lattice
## Loading required package: MASS
## Loading required namespace: car
## 
## Attaching package: 'memisc'
## 
## Die folgenden Objekte sind maskiert from 'package:stats':
## 
##     contr.sum, contr.treatment, contrasts
## 
## Das folgende Objekt ist maskiert from 'package:base':
## 
##     as.array
# spss.system.file doesn't seem to open urls so you must refer to a locally
# saved file example for Mac OS-X ~ refers to the current users home
# directory; current users desktop can be referred to as '~/Desktop/'
# current users download directory can be referred to as '~/Downloads/'
stud <- as.data.set(spss.system.file("~/Desktop/stud.sav"))
# example for Windows Windows path names in R are separated by '/' not by
# '\'
stud <- as.data.set(spss.system.file("/Users/pzezula/lehre/lehre_ss_2014/data/div/stud.sav"))

QuickR über Fremdformate

Im R-Commander kann man einige Fremdformate, hier z. B. SPSS, über Datenmanagement | Importiere Daten | aus SPSS Datendatei einlesen.

Anpassen der Datentypen

Die hier relevanten Datentypen in Dataframes sind

numeric integer string factor

Datentyp kontrollieren und ggf. korrigieren. Das gilt insbesondere für Gruppierungsvariablen, die in R vom Typ factor sein müssen, um richtig behandelt zu werden.

# read stud data
stud <- read.delim("http://r.psych.bio.uni-goettingen.de/mv/data/div/stud_utf8.txt", 
    fileEncoding = "UTF-8")
# stud is data.frame
class(stud)
## [1] "data.frame"
# check type of columns of stud
lapply(stud, class)
## $no
## [1] "integer"
## 
## $height
## [1] "integer"
## 
## $shoe_size
## [1] "numeric"
## 
## $weight
## [1] "numeric"
## 
## $gender
## [1] "integer"
## 
## $birth_month
## [1] "integer"
## 
## $birth_year
## [1] "integer"
## 
## $statistics_grade
## [1] "numeric"
## 
## $abitur
## [1] "numeric"
## 
## $math_intense
## [1] "integer"
## 
## $academic_background
## [1] "integer"
## 
## $computer_knowledge
## [1] "integer"
## 
## $string
## [1] "factor"
# gender should be a grouping variable, although coded with integers
class(stud$gender)
## [1] "integer"
# convert it, old column overwritten
stud$gender_f <- factor(stud$gender, levels = c(1, 2), labels = c("f", "m"))

Mehr zu Datenaufbereitung unter [http://r.psych.bio.uni-goettingen.de/mv/units/data_transformation/data_transformation.Rmd]

Datenfiles schreiben

R-Commander

Syntax

Beispiel

# write to a file in current directory dataframe 'stud' must exist
write.table(stud, "stud_example.txt", sep = "\t", row.names = F, quote = F)

Export bzw. wegschreiben eines Datenobjektes 'my.data':


# write dataframe, default settings
write.table(my.data, "p:/my_data.dat")
## Error: Objekt 'my.data' nicht gefunden

# write dataframe, tab-delimited
write.table(my.data, "p:/my_data.dat", sep = "\t")
## Error: Objekt 'my.data' nicht gefunden

# if you don't like the quoted strings and variable names:
write.table(my.data, "p:/my_data.dat", sep = "\t", quote = F)
## Error: Objekt 'my.data' nicht gefunden

# if you don't like automatically generated line or case numbers
write.table(my.data, "p:/my_data.dat", sep = "\t", quote = F, row.names = F)
## Error: Objekt 'my.data' nicht gefunden

Der Export aus R für Spreadsheet-Dateien geht mit write.table() bzw. write.csv().

Datei-Erweiterungen (file extensions)

*.R *.Rdata *.Rmd

Links