Sitzung 3

Wiederholung

Das Wichtigste vom letzten Mal

  • Vektoren sind eindimensionale Tupel von Elementen
# vektoren erstellen
a <- 1:19
b <- a + 19
c <- c("svo", "sov", "ovs")

# vektoren ausgeben lassen
c
## [1] "svo" "sov" "ovs"
length(b)
## [1] 19

Das Wichtigste vom letzten Mal

  • Dataframes sind Tabellen (und damit 2-dimensional)
df <- data.frame(a, b)
dim(df)
## [1] 19  2
head(df, 1) # eine statt sechs zeilen als optionales argument
##   a  b
## 1 1 20
tail(df, 2)
##     a  b
## 18 18 37
## 19 19 38
df$c <- a + b
head(df, 1)
##   a  b  c
## 1 1 20 21

Das Wichtigste vom letzten Mal

head(df[, 1])
## [1] 1 2 3 4 5 6
df[df$a == 19, ]
##     a  b  c
## 19 19 38 57
df[df$a + df$b > 50, ]
##     a  b  c
## 16 16 35 51
## 17 17 36 53
## 18 18 37 55
## 19 19 38 57
subset(df, b > 35) # alle Reihen, auf die die Bedingung zutrifft
##     a  b  c
## 17 17 36 53
## 18 18 37 55
## 19 19 38 57

Mehr zu Datenblättern

Spalten umbenennen

names(df) <- c("low", "medium", "high")
head(df)
##   low medium high
## 1   1     20   21
## 2   2     21   23
## 3   3     22   25
## 4   4     23   27
## 5   5     24   29
## 6   6     25   31

Mehr Subsetting

  • logische Bedingungen (beachtet hier das Komma! Wir arbeiten jetzt mit 2-dimensionalen Daten und müssen mit angeben, ob wir uns auf Zeilen oder Spalten beziehen)
df[df$low >= 17, ]
##    low medium high
## 17  17     36   53
## 18  18     37   55
## 19  19     38   57
df[df$low + df$medium > 53, ]
##    low medium high
## 18  18     37   55
## 19  19     38   57
df[df$low %% 2 == 0 & df$high > 38, ] # modulo division -> rest = 0
##    low medium high
## 10  10     29   39
## 12  12     31   43
## 14  14     33   47
## 16  16     35   51
## 18  18     37   55

Noch mehr Subsetting

  • Mengen: %in% fungiert wie \(\in\) aus der Mengentheorie
df[df$low %in% c(5, 6, 7), ]
##   low medium high
## 5   5     24   29
## 6   6     25   31
## 7   7     26   33
df[df$low %in% c(5, 6, 7) | df$high %in% c(23, 25), ]
##   low medium high
## 2   2     21   23
## 3   3     22   25
## 5   5     24   29
## 6   6     25   31
## 7   7     26   33

Daten exportieren

Workspace

Wenn wir mir externen Daten (also solchen, die wir nicht in R generiert und/oder nicht nur in R verwenden wollen) arbeiten, müssen wir uns für einen Speicherort entscheiden. Ganz allgemein wird R ein Standardverezeichnis festlegen. Schaut mal eures nach.

getwd()
## [1] "/Users/Maik/Library/Mobile Documents/com~apple~CloudDocs/Studium/Arbeit am SDP/Tut Inferenzstatistik"

Workspace verändern

Wenn ihr das Arbeitsverzeichnis verändern wollt, könnt ihr dies mit setwd() machen. Wie genau ihr die Pfade festlegt, könnt ihr entweder im Internet nachschauen (das variiert ziemlich zwischen Windows und Mac) oder per Rstudio über den Tab “Files”

RStudio zum Workspace festlegen

Workspace verändern

Selbst wenn ihr RStudio verwendet, um das Arbeitsverzeichnis zu verändern, solltet ihr die Codezeile aus der Konsole in eurer Skript kopieren, damit ihr das beim nächsten Mal nicht nochmal erledigen müsst, sondern einfach den Code ausführen könnt.

setwd("~/Desktop")
getwd()
## [1] "/Users/Maik/Desktop"

write.csv/write.table

write.csv(ObjektNameInR, "PFAD", WeitereParameter)
  • weitere Parameter
    • Zeilennummerierung übernehmen: row.names=TRUE/FALSE
      • Die Zeilennummerierung wird als erste Spalte übernommen. Die Spaltenbezeichnungen werden dementsprechend nach links verschoben, sodass die col.names manuell angepasst werden müssen.
    • Dezimalstellentrennungszeichen bestimmen: dec=„Trennungszeichen“
    • Separatoren definieren: sep = „Separator“
    • Strings in Anführungszeichen einschließen: quote = TRUE/FALSE

Übersicht

# Zeilennummerierung von R wird nicht in die neue Tabelle übernommen
write.table(d, "tab.csv", row.names = F)

# Erstellt eine Tabelle, die Tabstops als Zellentrenner benutzt
write.table(d, "tab.csv", sep = "\t")

# Erstellt eine Tabelle mit Kommas als Dezimalstellentrenner
write.table(d, "tab.csv", dec = ",")

# Erstellt eine Tabelle mit Semikolons als Separatoren
write.table(d, "tab.csv", sep = ";")

# NAs werden als "Nicht vorhanden" bezeichnet
write.table(d, "tab.csv", na = "Nicht vorhanden")

Datenblatt speichern

Als nächstes können wir unseren Dataframe im Arbeitsverzeichnis unter dem angegebenen Namen abspeichern. Falls ihr andere Dateiformate verwenden wollt, schaut euch mal write.table an.

head(df)
##   low medium high
## 1   1     20   21
## 2   2     21   23
## 3   3     22   25
## 4   4     23   27
## 5   5     24   29
## 6   6     25   31
write.csv(df, "df_test.csv", row.names = F, quote = F)

Daten einlesen

Interlude: Dateiformate

Dateiformate

  • Jede Datei wird in einem Dateiformat abgespeichert
  • Endungen bestimmen die Art (z.B. ein Programm), mit welcher der Computer eine Datei öffnet
  • Gägige Dateiendungen für unsere Zwecke -Comma-separated values: .csv
    • Tab-separated values: .tsv
    • Text-Datei: .txt
    • Unbestimmte Datei: .dat
    • Excel: xls
      • R kann xls nur mit bestimmten Paketen lesen

read.table()

  • Voraussetzung: einzulesende Datei befindet sich im Arbeitsverzeichnis bzw. in einem im Arbeitsverzeichnis liegenden Unterordner
  • wichtige optionale Argumente von read.table/read.csv
    • header = TRUE/FALSE
    • sep = “Separator für Einträge”
      • oft verwendet: Komma, Semikolon, Leerzeichen oder Tabstopps
    • dec = “Dezimalzahltrennungszeichen”
      • beachte: R verwendet den Punkt und nicht das Komma als Dezimaltrenner
    • na.strings = “Zeichenkette, die als NA definiert werden soll” (oder Vektor mit mehreren Strings)
    • skip = Zeile, bis zu der übersprungen werden soll
    • blank.lines.skip = TRUE
    • comment.char = “Kommentarzeichen”

Ein Beispiel

Ich habe hier ein einfaches Beispiel, bei dem man keine weiteren Parameter angeben muss, damit ihr sehen könnt, wie es funktioniert.

Bei Gelingen sieht das dann so aus:

d <- read.csv("docs/data/tut3/example.csv")
head(d)
##                                 id          item judgment tester years months
## 1 3536fed0235c7b34a33ddf06fb91b390  schaffen4_at        5 mailin     5      1
## 2 3536fed0235c7b34a33ddf06fb91b390 schaffen1_non        5 mailin     5      1
## 3 3536fed0235c7b34a33ddf06fb91b390    cleft2_non        5 mailin     5      1
## 4 3536fed0235c7b34a33ddf06fb91b390   appRel3_non        5 mailin     5      1
## 5 3536fed0235c7b34a33ddf06fb91b390   appRel9_non        4 mailin     5      1
## 6 3536fed0235c7b34a33ddf06fb91b390 gewinnen2_non        4 mailin     5      1
##   gender        issue       trigger    itemid      lex
## 1      w     at-issue          soft schaffen4 schaffen
## 2      w non-at-issue          soft schaffen1 schaffen
## 3      w non-at-issue          hard    cleft2    cleft
## 4      w non-at-issue appositive RC   appRel3   appRel
## 5      w non-at-issue appositive RC   appRel9   appRel
## 6      w non-at-issue          soft gewinnen2 gewinnen

Vorsicht

Beachtet man die genannten Parameter nicht, bekommt man schnell unbrauchbaren Datensalat:

head(read.csv("docs/data/tut3/raw.txt"))
##               blablablablabla.wejfuwejfnqj.qfnwejfn
## 1             1\t1\ta\tdass der Peter den Hans mag.
## 2            1\t1\tb\tdass den Hans der Peter mag. 
## 3  1\t1\tc\tdass der Peter sicherlich den Hans mag.
## 4 1\t1\td\tdass den Hans sicherlich der Peter mag. 
## 5         1\t2\ta\tdass die Frau den Bäcker liebt. 
## 6         1\t2\tb\tdass den Bäcker die Frau liebt.

Übungen

  1. Lese die folgenden Dateien in R ein (Objektzuweisung nicht vergessen!):

    • alldata.dat
    • Beispiel.csv
    • Tutorium_dat3.txt
    • NHIS_2007_data4.csv
    • lungen.txt
    • Tutorium_4.dat
    • raw.txt
    • raw2.txt
    • master.txt

Lösungen

# "alldata.dat"
d1 <- read.table("docs/data/tut3/alldata.dat", header = T)
head(d1)
##              id geo subject variant experiment item condition judgement
## 1 m-1987-EMusik bla       1       1          9    4         a         6
## 2 m-1987-EMusik bla       1       1          8    2         b         7
## 3 m-1987-EMusik bla       1       1          7   10         b         7
## 4 m-1987-EMusik bla       1       1          9    3         d         1
## 5 m-1987-EMusik bla       1       1          1    8         d        NA
## 6 m-1987-EMusik bla       1       1          8    9         a         6
# "Beispiel.csv"
d2 <- read.csv("docs/data/tut3/Beispiel.csv", sep = ";", header = T)
head(d2)
##   subject item condition judgement F1 F2
## 1       1   10         b         3  0  1
## 2       1    4         d         4  1  1
## 3       1   15         c         7  1  0
## 4       1    9         a         2  0  0
## 5       1   16         d         1  1  1
## 6       1   13         a         7  0  0

Lösungen

# "Tutorium_dat3.txt"
d3 <- read.table("docs/data/tut3/Tutorium_dat3.txt", header = T, sep = "\t")
head(d3)
##   ProbandIn Geschlecht Treatment Zeit1 Zeit2 Zeit3
## 1         1          f         1  19.7  19.7  20.5
## 2         2          f         2  14.2  16.9  17.3
## 3         3          f         3  11.2  14.2  17.2
## 4         4          f         1  18.8  20.3  28.5
## 5         5          f         2  14.8  25.3  30.2
## 6         6          f         3  11.1  12.1  16.2
# "NHIS_2007_data4.csv"
d4 <- read.csv("docs/data/tut3/NHIS_2007_data4.csv", header = T, sep = ";",
  dec = ",")
head(d4)
##   HHX FMX FPX SEX   BMI SLEEP educ height weight
## 1  16   1   2   1 33.36     8   16     74    260
## 2  20   1   1   1 26.54     7   14     70    185
## 3  69   1   2   2 32.13     7    9     61    170
## 4  87   1   1   1 26.62     8   14     68    175
## 5  88   1   1   2 27.13     8   13     66    168
## 6  99   1   1   2 99.99    98   12     98    998

Lösungen

# "lungen.txt"
d5 <- read.table("docs/data/tut3/lungen.txt", header = T, sep = "|",
  dec = ",")
head(d5)
##   Lungenkapazität Alter Größe Raucher Geschlecht Kaiserschnitt
## 1           6.475     6  62.1      no       male            no
## 2          11.125    14  71.0      no       male            no
## 3           4.800     5  56.9      no       male            no
## 4           7.325    11  70.4      no       male            no
## 5           8.875    15  70.5      no       male            no
## 6           6.800    11  59.2      no       male            no
# "Tutorium_4.dat"
d6 <- read.table("docs/data/tut3/Tutorium_4.dat", sep = ";", dec = ",",
  header = F, na.strings = c("umgeknickt", "verdorrt"))
head(d6)
##   V1 V2   V3   V4   V5
## 1  1  1 19.7 19.7 20.5
## 2  1  2 14.2 18.9 27.3
## 3  1  3 11.2 24.2 37.2
## 4  2  1 18.8 20.3 28.5
## 5  1  2 14.8 25.3 30.2
## 6  1  3 11.1 12.1 16.2

Lösungen

# "raw2.txt"
d8 <- read.table("docs/data/tut3/raw2.txt", sep = "\t", skip = 1,
  comment.char = "%")
head(d8)
##   V1 V2 V3                                       V4
## 1  1  1  a             dass der Peter den Hans mag.
## 2  1  1  b            dass den Hans der Peter mag. 
## 3  1  1  c  dass der Peter sicherlich den Hans mag.
## 4  1  1  d dass den Hans sicherlich der Peter mag. 
## 5  1  2  a         dass die Frau den Bäcker liebt. 
## 6  1  2  b         dass den Bäcker die Frau liebt.
# "raw.txt"
d7 <- read.table("docs/data/tut3/raw.txt", sep = "\t", skip = 1,
  header = F)
head(d7)
##   V1 V2 V3                                       V4
## 1  1  1  a             dass der Peter den Hans mag.
## 2  1  1  b            dass den Hans der Peter mag. 
## 3  1  1  c  dass der Peter sicherlich den Hans mag.
## 4  1  1  d dass den Hans sicherlich der Peter mag. 
## 5  1  2  a         dass die Frau den Bäcker liebt. 
## 6  1  2  b         dass den Bäcker die Frau liebt.

Lösungen

# "master.txt"
d9 <- read.table("docs/data/tut3/master.txt", sep = "&",
  comment.char = "$", dec = ",", header = T)
head(d9)
##   korinon povalon tertiron anbolon velbidon
## 1 korinon   1.230 tertiron      ja        0
## 2 korinon   4.230 tertiron    nein        0
## 3 korinon   1.124 tertiron      ja        0
## 4 korinon   8.340 tertiron    nein        1
## 5 korinon   0.900 tertiron    nein        1
## 6 korinon   6.740 tertiron    nein        0

Daten einlesen mit GUI

Und Tschüss

Bis nächste Woche!