Rmd

Vorläufigkeit

Diese Unterlagen, auch die zugehörigen Screencasts verändern sich in den nächsten Tagen noch bzw. werden ergänzt.

Blockveranstaltung

Einführung in R, R-Studio und R-Markdown

Erklärung, Demonstration und Übungen zur Arbeitsumgebung R-Console, RStudio, R-Markdown

Wegen der besonderen Situation 2021 mit Screencasts an Stelle von Life-Demonstrationen

Einige Verweise auf weitere Möglichkeiten, sich auch im Selbststudium in R und R-Studio einführen zu lassen, finden sich am Ende ab Swirl, eine gute Möglichkeit, sich in R “an der Hand nehmen zu lassen”. Danke an Birk.

Außerdem spricht der Einstiegs-Screencast [StudIP]](https://studip.uni-goettingen.de/plugins.php/mediacastplugin/media/check/557da707f35cbedf27871677d1e8e982/ddf2aa3d702d4f6841994519e5aa73dc/127?v=starthilfe.mp4) - ownCloud von Kai sicherlich auch viele an. Der Screencast war für das SS 2020, gilt aber weitgehend auch für das SS 2021.

Umgebung

Pool

Der Computerpool ist ab SS 2020 sogar mit einer Klimatisierung ausgestattet. Leider kann sie vorerst niemand nutzen, da man sich im Pool näher als 2m kommt.

Lehre-Terminalserver

Die Installation von R und R-Studio für diese Übung und auch für die Prüfung findet sich auf einem Windows-Terminalserver, der erreichbar ist unter dem Namen

teaching.psych.bio.uni-goettingen.de:49121

Anleitungen zum Aufbau einer RDP-Verbindung zu diesem Server (login nötig, stud. Account):

https://www.psych.uni-goettingen.de/de/it/documentation/teaching-terminalserver

Screencasts

login bei StudIP nötig, stud. Account

Göttinger Besonderheiten

Hinweise zu Multi-Plattform-Benutzung von R und zu Göttinger Besonderheiten

  • Studierende der Psychologie (ug-student...) und Mitarbeiter des Institutes (gwdg...) können sich anmelden

  • das eigene P-Laufwerk mit den persönlichen Daten wird automatisch zur Verfügung gestellt

  • Falls nicht schon geschehen: Bitte richten Sie unbedingt ein: P:\R\library Das R muss ein großes sein, das l bei library klein. Erklärung folgt.

  • R ist case sensitive, unterscheidet also zwischen Groß- und Kleinbuchstaben in seinen internen Namen. Betriebssysteme wie Mac-OS-X und Linux machen das grundsätzlich auch, Windows bei Dateinamen und Pfaden nicht. FileName != Filename != filename

  • R ist ein Multi-Plattform-Programm. Daher empfehlen wir dringend und in eigenem Interesse, auch unter Windows Groß- und Kleinschreibung zu unterscheiden.

  • vermeiden Sie im eigenen Interesse in Pfad- und Dateinamen Sonderzeichen und Leerzeichen. Auch 2021 gibt es nach wie vor Probleme, weil immer noch nicht überall UTF-8 als Codierung von Strings eingehalten wird.

  • Bei allen Pfadangaben in R müssen die Teile mit / und nicht mit dem unter Windows üblichen \ getrennt werden. Den oben erwähnten Library-Pfad auf dem Lehre-Server P:\R\library müsste in R also als P:/R/library angegeben werden. Kontrolle in R: .libPaths()

  • Auf dem Lehre-Server wird für alle Benutzer das Arbeitsverzeichnis (working directory) gesetzt auf P: Bitte prüfen Sie das mit getwd() in der R-Console und korrigieren Sie es ggf. mit setwd("P:/") Die persönlichen Laufwerke haben im Göttinger Universitäts-Umfeld Namen, die mit doppeltem Backslash \\ug-uyst-ba-cifs.student.uni-goettingen.de\home\users\... beginnen. Windows UNC-Schreibweise von Netzpfaden im Gönet funktioniert unter R nicht. Vermeiden Sie am besten auch das beliebte Speichern auf dem Windows-Desktop, wenn Sie die Dateien in R benutzen wollen. Am besten benutzen Sie durchgehend ein Unterverzeichnis von P:\, z. B. P:\mv oder in R P:/mv. Das gilt für Downloads, Kursmaterialien und alles andere, was Sie unter R benutzen wollen.

  • Bitte verwenden Sie Firefox oder Chrome für Browser Downloads. Rechtsklick save as macht sonst Probleme, da die Dateien teils neue Extensions bekommen.

  • OwnCloud, Zugriff und Verwendung für eigene Projekte, siehe unten.

  • Sticks und lokale Speichermedien: je nach Konfiguration der RDP-Verbindung funktionieren sie direkt bzw. per copy/paste für Dateien.

  • copy/paste für Text funktioniert mit den üblichen Shortcuts, selbst auf Macs mit aktuellen RDP-Programmen

Aufgaben

  • bauen Sie Verbindungen zum Lehre-Server auf und wieder ab
  • orientieren Sie sich auf dem Windows-Dateiexplorer, finden Sie ihr P-Laufwerk und Ihre persönlichen Daten dort
  • starten Sie einen Browser und suchen Sie die Ressourcen für diese Veranstaltung
  • öffnen Sie die Veranstaltungs-Homepage
  • öffnen Sie eines der Tutorials
  • laden Sie etwas herunter und speichern Sie es in Ihrem persönlichen Bereich für die Veranstaltung
  • Starten Sie R-Studio
  • überprüfen Sie die Existenz von P:/R/library aus R heraus
  • überprüfen Sie, ob Sie die Downloads finden, die Sie gemacht haben
  • übertragen Sie Dateien zwischen dem Server und ihrem lokalen Rechner
  • finden Sie die Unterschiede zwischen dem Schließen der RDP-Verbindung und dem Abmelden auf dem Lehre-Server
  • spielen Sie, spielen Sie, spielen Sie - mit allem

check

  • was ist der Lehre-Server, wie komme ich dort hin, warum brauche ich ihn?
  • welche Ressourcen habe ich in der Uni bzw. brauche ich für die Veranstaltung, für die Prüfung
  • wie kommen meine Daten hoch und herunter
  • welche Grundeinstellungen sind notwendig und sinnvoll
  • was ist das Arbeitsverzeichnis (working directory) in R und wozu dient es?

R-Console

Stichpunkte

  • Konsole als interaktive Schnittstelle zu R

  • Kommandozeile (Cursor)

  • versucht, Eingaben als R-Befehle zu interpretieren

  • ein paar Beispiele simpler Mathe

  • Textzeilen mit Kommandos, die abgearbeitet werden (R-Programm wäre viele solcher Zeilen, s. u.)

  • Zeile zurückholen

  • Copy und Paste aus history in command line

  • copy-paste aus anderen Quellen möglich

  • Ergebnisse “laufen durch”

  • R kennt Objekte

  • R hat viele vordefinierte Objekte (z. B. pi)

  • Wir können Objekte definieren, indem wir einem Objekt einen Namen geben und ihm einen Inhalt zuweisen

  • Objekte werden im Environment gespeichert

  • Wir benutzen Objekte, indem wir ihren Namen gebrauchen

  • R kennt Funktionen (z. B. sqrt(), log(), exp() )

  • Wir erkennen Funktionen an den Klammern (brackets)

  • In den Klammern übergeben wir Argumente

  • geschachtelte R-Ausdrücke werden von innen nach außen aufgelöst

  • Mini statistics sum()

    1. B. Körpergrößen: 180, 176, 180, 182, 160, 156, 165, 160, 159, 189
  • sd(), var(), mean()

  • Objekte können ein oder mehrere Elemente enthalten

  • combine: c()

  • Daten-Objekt

  • Grafiken werden ebenfalls über Befehle erzeugt, wir programmieren Grafiken

  • Grafiken in eigenem Fenster, können aber über Befehle gespeichert werden oder per copy-paste in andere Dokumente integriert werden

  • Tabellen als Datenobjekte data.frame

  • Ergebnisobjekte

  • ein paar Versuche und Demos

# a first impression on R using the console and some very basic concepts
# objects, functions, data objects, descriptive stats and a first impression on graphs
version
##                _                           
## platform       x86_64-apple-darwin17.0     
## arch           x86_64                      
## os             darwin17.0                  
## system         x86_64, darwin17.0          
## status                                     
## major          4                           
## minor          0.5                         
## year           2021                        
## month          03                          
## day            31                          
## svn rev        80133                       
## language       R                           
## version.string R version 4.0.5 (2021-03-31)
## nickname       Shake and Throw
# simple computations
17 * 5
## [1] 85
(4 + 5) * 2  # precedence of multiplication and parenthesis
## [1] 18
2e+04        # exponential writing of numbers
## [1] 20000
# simple objects: containers with a name
# f. e. number pi
# objects show their content in the console, if we call them by name
pi
## [1] 3.141593
# we can use them instead of input
pi ** 2
## [1] 9.869604
# we can define our own objects using "=" or even clearer "<-" and use them
pi_2 <- pi ** 2
pi_2
## [1] 9.869604
# we can create our own objects by assigning something to a name using "=" or "<-"
ss = "Paul who made the highscore recently" # we create an object that contains a string
aa = 3948527349584259827                    # the content of aa is a large number
rr <- sqrt(9)                               # rr stores the result of a function call
# we can use objects by calling/using the name
ss  # shows the string contained
## [1] "Paul who made the highscore recently"
aa  # shows the number stored
## [1] 3.948527e+18
# functions, are objects that have parameters in brackets
# a lot of them are predefined in R base or in packages, but we can define our own functions also
# parameters depend on the function in question, some might not even need any: empty brackets ()
getwd()     # returns the current working directory
## [1] "/Users/pzezula/ownCloud/lehre_ss_2021/unit/block_intro"
Sys.time()  # returns the current date and time
## [1] "2021-04-12 09:38:19 CEST"
# Sys.getenv() would return all system variables, to get a specific one we ask for it
Sys.getenv("PATH")
## [1] "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/Applications/RStudio.app/Contents/MacOS/postback"
# sqrt() needs at least one parameter
# sqrt() # would cause an error, try it
sqrt(9) # returns 3
## [1] 3
log(10) # take the logarithm of 10
## [1] 2.302585
exp(0)  # compute the exponential value of 0 (=1)
## [1] 1
sin(1)  # sinus of 1
## [1] 0.841471
# we may use nested expressions in R
# the argument can itself be function, so the inner functions result is passed to the outer function
rr <- sqrt(3 * 3 * 9)
sqrt(rr)
## [1] 3
sin(sqrt(rr))
## [1] 0.14112
exp(sin(sqrt(rr)))
## [1] 1.151563
sqrt(sqrt(81))
## [1] 3
log(exp(0))
## [1] 0
# we can store the result of our nested expressions in an object, 
# as we can store anything in an object and use it by calling it's name
# we use a name of an existing object (rr) and therefore it is overwritten with the result of our nested expression
rr <- exp(sin(sqrt(rr)))

# using basic statistics
# f. e. if we have some  body heights 180, 176, 180, 182, 160, 156, 165, 160, 159, 189
# sum works
sum(180, 176, 180, 182, 160, 156, 165, 160, 159, 189)   # sum of our collected heights
## [1] 1707
mean(180, 176, 180, 182, 160, 156, 165, 160, 159, 189)  # idea: arithmetic mean, average height, doesn't work, why?
## [1] 180
# mean accepts only one unnamed parameter
# we better store our body heights in an object and use this instead
# heights <- 180, 176, 180, 182, 160, 156, 165, 160, 159, 189 would not work, we have to convert our values to a unit (vector) by using c()
heights <- c(180, 176, 180, 182, 160, 156, 165, 160, 159, 189)
# heights is a data object
# as with any other object we can access our data by using the name of the data object instead of using the values directly
mean(heights)
## [1] 170.7
sd(heights)
## [1] 11.91684
mean(heights)
## [1] 170.7
sum(heights)
## [1] 1707
# we can create graphs using commands
plot(heights)

boxplot(heights)

# imagine we also collected weights of the same observations
weights = c(60, 54, 110, 52, 62, 41, 71, 70, 44, 60)
length(weights) # number of values included
## [1] 10
mean(weights)   # average weight
## [1] 62.4
# now, we have two sources of data for the same people
# R can have multiple sources of data at a time
# so we could compare them f. e.
mean(heights) > mean(weights)
## [1] TRUE
# ... which is hopefully TRUE ;-)

# of course, R also knows data tables (vars in columns, observations in lines)
# they are called data frames in R base
# a first glance
dd <- data.frame(heights, weights)
# show our data table
dd
##    heights weights
## 1      180      60
## 2      176      54
## 3      180     110
## 4      182      52
## 5      160      62
## 6      156      41
## 7      165      71
## 8      160      70
## 9      159      44
## 10     189      60
# access weights in data table "data" using the $ operator
dd$weights
##  [1]  60  54 110  52  62  41  71  70  44  60
# calculate average heights
mean(dd$heights)
## [1] 170.7
# dd is also an object in R
# you can see it in the Environment in R-Studio
# you can also check its structure there by clicking on the little blue arrow in front of the name

# we can use multiple data objects in one plot
plot(heights, weights)

# the same using two columns of one data object
plot(dd$heights, dd$weights)

# we might play around with some more data and columns
ht     <- c(  180,   176,   180,   182,   160,   156,   165,   160,   159,   189)
wt     <- c(   60,    54,   110,    52,    62,    41,    71,    70,    44,    60)
gender <- c(  "m",   "m",   "f",   "f",   "f",   "f",   "f",   "f",   "f",   "m")
group  <- c(    1,     1,     1,     1,     1,     2,     2,     2,     2,     2)


dd <- data.frame(ht, wt, gender, group)

Screencast

Aufgaben

  • rechnen Sie mit der Konsole
  • definieren Sie Objekte verschiedenen Typs
  • überschreiben Sie Objekte und überprüfen Sie, was Sie getan haben
  • experimentieren Sie mit Funktionen
  • suchen Sie sich für Sie neue R-Funktionen und experimentieren Sie damit hierbei sind sog. Cheat-Sheets nützlich: Sie finden einige davon unter Help im R-Studio Menu, Websuchen helfen natürlich auch
  • machen Sie geschachtelte Ausdrücke in R
  • suchen Sie sich R-Code im Web, z. B. aus Tutorials, es gibt viele davon, und fügen ihn in die Konsole ein
  • machen Sie Versuche mit einfachen Statistikfunktionen
  • experimentieren Sie mit Daten-Arrays und Data-Frames
  • experimentieren Sie …

check

  • was ist die Konsole in R, brauche ich sie?
  • was kann ich in der Konsole tun und wie geht das?
  • habe ich eine grobe Idee, was in R (Daten-)Objekte, Funktionen, Environment sind?
  • habe ich eine grobe Idee von Daten in R?

R-Scripte

Stichpunkte

  • eine Folge von Zeilen mit R-Kommandos (Programm)

  • (auch) in Form einer Textdatei

  • die File-Extension von R-Skripten ist ‘.R’, z. B. jump-in.R

  • Kommentare mit # erleichtern das Verständnis später

  • R-Skripte können in R-Studio direkt erstellt werden

  • in R-Studio in einem R-Skript-Fenster können wir auch das Skript Zeile für Zeile ausführen und jeden Zwischenzustand kontrollieren. Die Zeile, in der der Cursor steht, können wir ausführen lassen, indem wir ctrl-Enter (Win) bzw. cmd-Enter(Mac) drücken.

  • nahezu alles, was man im Netz zu R findet, ist R-Code, meist in Form von kurzen R-Skripten, viele Beispiele, Problemlösungen, Erklärungen etc.

  • R-Code bzw. Skripte lassen sich per copy/paste in die Console einfügen und werden dort dann Zeile für Zeile ausgeführt Ergebnisse oder Fehlermeldungen erscheinen dann in der Console

  • R-Skripte können auch direkt aufgerufen werden und laufen dann ab, ggf. sogar außerhalb einer R-Studio-Session oder R-Session. Damit eignen sie sich zur Automatisierung von Aufgaben in R

  • Für die MV-Übung hier empfehlen wir allerdings das Benutzen von RMD, das weiter unten genauer vorgestellt wird. Nahezu alle Möglichkeiten von R-Skripten sind in RMDs auch möglich.

Screencast

Unter Mini Beispiel jump_in stellen wir ein minimales Beispiel, auch als R-Skript vor. Dies als Screencast

Aufgaben

  • bauen Sie sich ein Skript mit Befehlen ihrer Wahl
  • kommentieren Sie dabei, was Sie tun
  • speichern Sie das Skript
  • laden Sie es nach einem Neustart von R-Studio wieder neu
  • führen Sie es Zeile für Zeile aus (ctrl-Enter bzw. cmd-Enter) und kontrollieren dabei immer wieder, was als Ausgabe kommt und was im Environment passiert

check

  • weiß ich, was ein R-Skript bzw. ein R-Programm ist?
  • wie erstelle ich es, wie lasse ich es laufen,
  • was passiert mit den “Ergebnissen”, dem Output, Grafiken, wohin wird gespeichert, woher wird gelesen?

RStudio - eine Umgebung

Stichpunkte

  • eine besondere Umgebung (IDE) zur Benutzung von R mit vielfältigen Möglichkeiten
  • Zugriff auf alle wichtigen Informationen
  • R-Console ist integriert
  • Eingabe-Unterfenster (R-Skripte, Datentabellen, Tabs, später Rmd)
  • Environment Unterfenster (Speicher)
    • Variablen
    • Inspektion von Variablen (Viewer auf Dataframes)
    • Einlesen von Dateien
    • öffnen und speichern
    • History
    • global environment und packages
  • Teilfenster unten rechts (Hilfsbereich)
    • Dateibrowser
    • Grafikausgabe
    • Paketverwaltung
    • Help

ein paar besondere Tipps

  • inline rendering ausschalten

  • set working directory

  • cheatsheets

  • Datenobjekte, Workspace, kein I/O für einzelne Datenobjekte, aber Einlesemöglichkeit

  • spezielle auf RMD abgestimmte Möglichkeiten (run chunk, run all chunks above, )

  • dateispezifische Markdown Options in Header bar

  • dateispezifische Knit Options

  • der sequenzielle Charakter von R bleibt unter der Haube erhalten

  • das ist besonders wichtig, wenn Code-Teile ausgeführt werden

  • Global Options bzw. Preferences (Mac-OSX)

    • Tab width, soft wrap: Options | Code | Editing
    • show whitespace characters, Rainbow parantheses: Options | Code | Display
    • disable inline output: uncheck: R Markdown | Basic | Show output inline for all R Markdown documents

{} Screencasts dazu mit Vorstellen

Aufgaben

  • machen Sie sich mit R-Studio vertraut
  • stöbern Sie im Menu und in den Optionen
  • versuchen Sie zu verstehen, was Sie bei den Einstellungen verändern können
  • versuchen Sie sich Hilfe geben zu lassen, im Menu und im Help-Tab im Fenster rechts unten
  • experimentieren Sie mit Daten und Datenobjekten, deren Ansicht

check

  • bin ich hinreichend vertraut mit R-Studio (“herumspielen”)
  • weiß ich, wo ich die relevanten Informationen finde
  • habe ich zumindest einen groben Überblick über die Möglichkeiten, die es bietet?

Data I/O

Data I/O, Einlesen von Daten, Wegschreiben von Daten

Wir konzentrieren uns hier auf die Möglichkeit, einzelne Datenobjekte über URLs zu öffnen und zu verarbeiten. Dabei verzichten wir hier darauf, den lokalen Zugriff auf Datenfiles vorzustellen. Hierzu gibt es viele Tutorials und Materialien im Web.

Materialserver

Daten- und Beispielserver für diese Veranstaltung

Alle Materialien und Datendateien werden auf einem speziellen Server zur Verfügung gestellt.

Der Name des Servers ist:

https://md.psych.bio.uni-goettingen.de

Auf dem Server sind auch die Beispielklausuren zu finden. Diese sind nur von innerhalb des Gönet erreichbar. Es ist also ein VPN-Tunnel (Cisco) notwendig, wenn Sie nicht im GöNet sind, z. B. im Institut oder in der SUB.

Einlesen aus URL

Einlesen von Daten (einzelner Datenobjekte) aus URL

R kann Daten in verschiedenen Formaten direkt aus URLs öffnen. Wir konzentrieren uns hier auf das Einlesen aus

  • Textdateien (Tab-delimited) aus URLs,
  • aus speziellen Textdateien im CSV-Format aus URLs
  • auf das direkte Einlesen von R-Datenobjekten mit allen R-Eigenschaften, ebenfalls aus URLs.

Je nach Format und Einlesebefehl werden die eingelesenen Datensätze unterschiedlich interpretiert. Das führt vor allem bei den automatischen Konvertierungen zu teils unvorhersehbarem und damit nicht reproduzierbarem Verhalten. Das hat weitreichende Konsequenzen vor allem bei der automatischen Umwandlung von Textvariablen in den Variablentyp factor, der in den statistischen Verfahren eine Schlüsselrolle spielt. Hier ein erläuterndes Beispiel und unser Vorschlag zur Vereinheitlichung und zu nachhaltigem Vorgehen, zumindest in dieser Veranstaltung und Umgebung (readRDS und saveRDS).

Es werden Einlese-Befehle des Base-System und des Paketes tidyverse vorgestellt und verglichen. Achten Sie auf den Unterschied zwischen ‘.’ und ’_’ in den Befehlen, z. B. read.csv vs read_csv (base vs tidyverse’s readr command) tidyverse’s read commands

Wir empfehlen die Verwendung von readRDS zum Einlesen und saveRDS zum Speichern einzelner R-Datenobjekte. Damit können R-Datenobjekte direkt gelesen bzw. gespeichert werden, ohne dass eine Neuinterpretation des Inhaltes beim Einlesen geschieht. Alle Attribute eines R-Datenobjektes bleiben erhalten.

# among base system's read in commands we use tidyverse's readr commands, therefore we need to load that package. Explanations of packages follow later.
require(tidyverse)
## Loading required package: tidyverse
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.3     ✓ purrr   0.3.4
## ✓ tibble  3.1.0     ✓ dplyr   1.0.5
## ✓ tidyr   1.1.3     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
# several methods to read in data objects in R directly from an URL

# pure text file
# http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi.txt
# "ht"  "wt"    "gender"    "group" "f.group"
# "1"   180 60  "m" 1   "lo"
# ...
# to read a text file with data columns separated by tabs directly from a known URL
dd1 <- read.delim("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi.txt")
dd2 <- read_tsv("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi.txt")
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   ht = col_double(),
##   wt = col_double(),
##   gender = col_character(),
##   group = col_double(),
##   grp_c = col_double(),
##   f.group = col_character()
## )
# CSV file as known by older Excel versions, data columns are separated by commas ","
# http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi.txt
# "","ht","wt","gender","group","f.group"
# "1",180,60,"m",1,"lo"
# ...
# to read it directly from a known URL
dd1 <- read.csv("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi_csv1.csv")
dd2 <- read_csv("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi_csv1.csv")
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   ht = col_double(),
##   wt = col_double(),
##   gender = col_character(),
##   group = col_double(),
##   grp_c = col_double(),
##   f.group = col_character()
## )
# CSV file as known by current Excel versions, data columns seprarated by semicolons ";"
# http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi_csv2.csv
# "";"ht";"wt";"gender";"group";"f.group"
# "1";180;60;"m";1;"lo"
# ...
# to read it directly from a known URL
dd1 <- read.csv2("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi_csv2.csv")
dd2 <- read_csv2("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi_csv2.csv")
## ℹ Using ',' as decimal and '.' as grouping mark. Use `read_delim()` for more control.
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   ht = col_double(),
##   wt = col_double(),
##   gender = col_character(),
##   group = col_double(),
##   grp_c = col_double(),
##   f.group = col_character()
## )
# to read a R data file directly from a known URL, we have to pass the URL to a decompressor command "gzcon"
# and use readRDS to finally read it into our current environment
dd <- readRDS(gzcon(url("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi.rds")))

Speichern

Speichern einzelner Datenobjekte

Direktes Speichern auf einem Webserver geht über Umwege mit R, ist aber kritisch. Daher wird hier nur das lokale Wegschreiben eines Datenobjekts in das aktuelle Arbeitsverzeichnis gezeigt.

# our working directory, where the files are written to
getwd()
## [1] "/Users/pzezula/ownCloud/lehre_ss_2021/unit/block_intro"
# we read a data object that we want to store locally
dd <- readRDS(gzcon(url("http://md.psych.bio.uni-goettingen.de/mv/data/div/sample_bi.rds")))

require(tidyverse)

# we write a text file with data columns separated by tabs
write.table(dd, file="sample_bi.txt", sep="\t")
# using tidyverse's readr
write_delim(dd, "sample_bi.txt", delim="\t")
write_tsv(dd, "sample_bi.txt")

# we write a CSV file data columns are separated by commas ","
write.csv(dd, file="sample_bi_csv1.csv")
write_csv(dd, "sample_bi_csv1.csv")

# we write a CSV file data columns are separated by semicolons ";"
write.csv2(dd, file="sample_bi_csv2.csv")
write_csv2(dd, "sample_bi_csv2.csv")

# we write a *.rds file, as directly known by R with all attributes
saveRDS(dd, "sample_bi.rds")

R Environment und .RData

Wichtig ist es, zu verstehen, dass R nicht nur eine Datenquelle hat (eine einzige Datentabelle), wie andere Statistikpakete. R kann alle Daten(-objekte) ansprechen, die es in seinem aktuellen Environment findet. Standardmäßig speichert R auch immer das gesamte Environment, also alle zum Zeitpunkt des Speicherns bekannten Objekte seines Environments. Normalerweise wird das in eine Datei namens .Rdata geschrieben, in das aktuelle Working-Directory. Beim Verlassen von R wird das auch standardmäßig angeboten. Zu einem beliebigen Zeitpunkt kann man das auch direkt veranlassen:

R-Projekte haben ein projektbezogenes Environment (siehe dort).

# suppose, we have two data objects called heights and dd in our current environment
# and our working directory is
getwd()
## [1] "/Users/pzezula/ownCloud/lehre_ss_2021/unit/block_intro"
# so we could save these two objects in a file called "1.RData" in the current working directory
save(heights, dd, file="1.RData")
# if we want to load these two data objects in our current environment, we could use:
load(file="1.RData") 

Aufgaben

  • lesen Sie auf verschiedene Arten und Weisen Daten ein
  • machen Sie eine Websuche nach Datensätzen und versuchen Sie, diese Daten direkt einzulesen
  • data() zeigt Ihnen die aktuell mit den Packages vorhanden Daten, das sind Beispieldaten, die R schon mitbringt spielen Sie mit diesen Daten
  • erzeugen Sie Datenfiles in verschiedenen Formaten, speichern Sie sie, suchen Sie sie im Windows-Explorer
  • speichern Sie Ihr gesamtes Environment, löschen Sie es, lesen Sie es wieder ein

check

  • verstehe ich die Grundidee vom Zugriff auf Daten(-tabellen) über URLs?
  • mit welchen Arten von Problemen muss ich beim Datenimport rechnen?
  • gibt es eine empfohlene Art, auf Daten zuzugreifen, wenn ja, welchen?
  • kenne ich die Befehle hierfür?
  • kann ich einzelne Datenobjekte so speichern, dass ich sie sicher unverändert wieder einlesen kann?

R-Packages

R-Packages oder Libraries

Stichpunkte

  • Packages sind Erweiterungen von R - es gibt tausende

  • Packages aktivieren (R-Studio, R-Syntax) Packages haben eigenen “Namespace”. Package-Befehle können sich maskieren Package Suchpfad .libPaths()

  • Packages direkt ansprechen mit :: Package Befehl über <package-name>::<package-command>

    1. B. psych::describe das Package muss nicht mal geladen sein, require(), library() sind nicht nötig vor Benutzung
  • Packages installieren - vorinstallierte Pakete, Installation in persönlichem Bereich (P: Laufwerk), install.packages(“sudoku”, lib.loc(“P:/R/library”))

  • Package Befehle und Dokumentation

  • Package “psych” entladen detach("package:psych", unload = TRUE)

  • Datensätze in Packages data(package='psychTools') Datensätze können auch über den :: Operator angesprochen werden, ohne das Package laden zu müssen dd <- psychTools::bfi

  • Packages finden, z. B. bei cran

  • Help for packages

    • browseVignettes('YourPackage')
    • help(package = 'YourPackage', help_type = 'html')

command masking

Funktionen oder allgemeiner Objekte mit demselben Namen in verschiedenen Packages können sich gegenseitig “maskieren”. Bei Maskierung wird das Objekt mit dem geforderten Namen des Package gefunden, das als letztes geladen wurde.

Problem: Viele geladene Packages, Standardsammlung von Packages am Anfang eines Scriptes

# we load packages
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
library(dplyr)
# package hierarchy
search()
##  [1] ".GlobalEnv"        "package:MASS"      "package:forcats"  
##  [4] "package:stringr"   "package:dplyr"     "package:purrr"    
##  [7] "package:readr"     "package:tidyr"     "package:tibble"   
## [10] "package:ggplot2"   "package:tidyverse" "package:stats"    
## [13] "package:graphics"  "package:grDevices" "package:utils"    
## [16] "package:datasets"  "package:methods"   "Autoloads"        
## [19] "package:base"
# conflicts
conflicts(detail=TRUE)
## $.GlobalEnv
## [1] "weights"
## 
## $`package:MASS`
## [1] "select" "npk"   
## 
## $`package:forcats`
## [1] "%>%" "%>%" "%>%" "%>%" "%>%"
## 
## $`package:stringr`
## [1] "%>%" "%>%" "%>%" "%>%" "%>%"
## 
## $`package:dplyr`
##  [1] "%>%"           "%>%"           "select"        "%>%"          
##  [5] "%>%"           "as_tibble"     "contains"      "ends_with"    
##  [9] "everything"    "last_col"      "matches"       "num_range"    
## [13] "one_of"        "starts_with"   "tibble"        "tribble"      
## [17] "%>%"           "add_row"       "as_data_frame" "as_tibble"    
## [21] "data_frame"    "data_frame_"   "frame_data"    "glimpse"      
## [25] "lst"           "lst_"          "tbl_sum"       "tibble"       
## [29] "tribble"       "trunc_mat"     "type_sum"      "enexpr"       
## [33] "enexprs"       "enquo"         "enquos"        "ensym"        
## [37] "ensyms"        "expr"          "quo"           "quo_name"     
## [41] "quos"          "sym"           "syms"          "vars"         
## [45] "filter"        "lag"           "intersect"     "setdiff"      
## [49] "setequal"      "union"        
## 
## $`package:purrr`
## [1] "%>%" "%>%" "%>%" "%>%" "%>%"
## 
## $`package:tidyr`
##  [1] "%>%"         "%>%"         "%>%"         "%>%"         "as_tibble"  
##  [6] "contains"    "ends_with"   "everything"  "last_col"    "matches"    
## [11] "num_range"   "one_of"      "starts_with" "tibble"      "tribble"    
## [16] "%>%"         "as_tibble"   "tibble"      "tribble"    
## 
## $`package:tibble`
##  [1] "%>%"           "%>%"           "%>%"           "%>%"          
##  [5] "as_tibble"     "tibble"        "tribble"       "%>%"          
##  [9] "add_row"       "as_data_frame" "as_tibble"     "data_frame"   
## [13] "data_frame_"   "frame_data"    "glimpse"       "lst"          
## [17] "lst_"          "tbl_sum"       "tibble"        "tribble"      
## [21] "trunc_mat"     "type_sum"     
## 
## $`package:ggplot2`
##  [1] "enexpr"   "enexprs"  "enquo"    "enquos"   "ensym"    "ensyms"  
##  [7] "expr"     "quo"      "quo_name" "quos"     "sym"      "syms"    
## [13] "vars"     "Position"
## 
## $`package:stats`
## [1] "filter"  "lag"     "weights"
## 
## $`package:graphics`
## [1] "plot"
## 
## $`package:datasets`
## [1] "npk"
## 
## $`package:methods`
## [1] "body<-"    "kronecker"
## 
## $`package:base`
## [1] "body<-"    "intersect" "kronecker" "plot"      "Position"  "setdiff"  
## [7] "setequal"  "union"
# with a suspicious command, here summarise()
getAnywhere(x = "select")
## 3 differing objects matching 'select' were found
## in the following places
##   package:MASS
##   package:dplyr
##   namespace:tidyselect
##   namespace:dplyr
##   namespace:MASS
## Use [] to view one of them
# alternatively for select
x = "select"
names(which(sapply(search(), FUN = function(env) exists(x, env, inherits = FALSE, mode = "function"))))
## [1] "package:MASS"  "package:dplyr"
# help by unloading the unwanted package or by explicitely calling a specific command
dplyr::select
## function (.data, ...) 
## {
##     UseMethod("select")
## }
## <bytecode: 0x7fdf9b6962c0>
## <environment: namespace:dplyr>

Workaround eigene Packages

Die Packages werden in einem Verzeichnis auf dem P: Laufwerk installiert und beim Laden wird mit angegeben, von wo aus das Package gelesen werden soll.

2019 neu: P:/R/library wurde zum default path zentral hinzugefügt .libPaths() Damit kann ein dort installiertes Paket ohne Angabe eines Load-Path gestartet werden

Beispiel: Hier wird P:\R\libraries als Verzeichnis für Libraries benutzt, Sie haben hier Schreibrechte.

[die Befehle unten dienen nur der Illustration, sind auskommentiert und werden nicht direkt ausgeführt]

# get and install a package called sudoku in a specified directory
install.packages("sudoku", lib="P:/R/library")
# load package sudoku explicitly by supplying the location of the package
library(sudoku, lib.loc='P:/R/library')
# ... the same using require()
require(sudoku, lib.loc='P:/R/library')

Screencast

  • Installation eigener Pakete im P-Laufwerk auf dem Lehre-Server StudIP - ownCloud

Aufgaben

  • laden/aktivieren Sie verschiedene Packages (in RStudio und als Command)

  • verschaffen Sie sich einen Überblick über die in dem Package enthaltenen Befehle

  • nutzen Sie testweise Befehle aus den geladenen Packages

  • lubridate installieren und ausprobieren, Datums- und Zeitberechnungen cf cf führen sie ein paar Zeit- und Datumsberechnungen durch

  • installieren Sie das Package sudoku

  • generieren Sie ein Sudoku

  • finden Sie die Lösung des neu generierten Sudoku

  • installieren Sie ein anderes, Ihnen interessant vorkommendes Paket finden Sie heraus, welche Datensätze es zur Verfügung stellt. laden Sie einen der Datensätze und machen Sie sich ein Bild, um welche Art von Daten es sich handelt. (psychTools, MPsychoR, )

  • prüfen Sie Namenskonflikte von Befehlen, also das sog. Masking finden Sie heraus, welche Version eines maskierten Befehls gerade aktiv ist (bei einem Aufruf ohne Package-Präfix via :: )

  • entladen Sie eines Ihrer geladenen Pakete

check

  • was sind R-Packages, wozu dienen sie?
  • kenne ich ein paar für mich wichtige Packages?
  • kann ich Packages laden, sicherstellen dass sie geladen sind, entladen?
  • kann ich Packages installieren?
  • auf dem Lehre-Server?
  • weiß ich, wie ich einen Package-Befehl direkt aufrufen kann?
  • was ist command masking, wie finde ich masking heraus, wie helfe ich mir bei masking, …

RStudio Projekte

check

  • Zweck? Vorteile?
  • anlegen, wechseln?

Stichpunkte

  • Projekte in R mit eigener Umgebung, eingenem RData, eigenen Verzeichnis, eigenem working directory uvm.
  • more about projects

ownCloud

Dies ist für diese Veranstaltung eher ein Nebenaspekt.

Stichpunkte

Die Universität Göttingen stellt allen Studierenden 10 GB ownCloud-Speicher zur Verfügung. Hier können Sie neben vielen anderen Möglichkeiten auch Datendateien speichern, freigeben und in R direkt benutzen.

Infos Owncloud Studierende

Seiten der GWDG zu ownCloud analog.

Vorgehen:

  • Daten in persönliche ownCloud hochladen
  • ein Datenfile anklicken, es ist dann ausgewählt (ein x beim Namen)
  • auf das Share-Symbol klicken
  • Klick auf die Schaltfläche ‘create public link’ (ohne Vergabe eines Passwortes)
  • durch Klick auf das ‘copy to clipboard’ landet die Link-Adresse in der Zwischenablage
  • diese Adresse kann dann direkt in R genutzt werden, indem ‘/download’ angehängt wird
  • leider ist damit der Original-Name des Dokumentes nicht mehr transparent

Beispiellink (eine freigegebene ownCloud Datendatei im CSV-Format vom studentischen Benutzer ‘psych.stud’): https://owncloud.gwdg.de/index.php/s/MwST1BwNLxtDon3

Einlesen in R-Skript:

# the ownCloud link is expanded with '/download'
dd <- read.delim('https://owncloud.gwdg.de/index.php/s/MwST1BwNLxtDon3/download')

check

  • weiß ich von ownCloud, will ich es benutzen?
  • wie funktioniert es, Vorteile für mich?
  • kann ich es in dieser Übung sinnvoll einsetzen?

R-Markdown - RMD

Stichpunkte

  • Ein R-Skript ist in sich oft wenig verständlich. Kommentare helfen - etwas. RMD ist eine elegante Lösung.

  • Ohne Rmd würden die Ergebnisse und Abbildungen von R-Skripten gesammelt und mit einem weiteren Werkzeug (Textverarbeitung) zu einem Bericht zusammengestellt werden müssen. Dies ist fehlerträchtig und vor allem schwer reproduzierbar (Open Science verlangt z. B. Reproducability)

  • Idee: Dokumentation und ausführbare R-Chunks in einer einzigen Datei - automatische Berichterstellung inklusive Berechnungen “on the fly”

  • Idee: Markdown

  • das RMD-Format ist das Standard-Format in dieser Lehrveranstaltung

  • fast alle Materialien hier sind gerenderte RMD-Dateien und haben am Anfang einen Link auf ihren eigenen Quelltext, also auf eine Datei *.Rmd, aus der das jeweils aktuelle Dokument generiert worden ist.

Behandelt in eigener Unit

Rmd

Screencast

Aufgaben RMD

  • erstellen Sie eine Rmd Datei, indem Teile Ihrer vorher erstellten Skripte Inhalt von R-Chunks sind
  • dokumentieren Sie im Markdown-Bereich, was in den R-Chunks inhaltlich passiert
  • Verändern Sie in den Markdown-Bereichen Struktur und Aussehen Ihres Enddokuments mit den vielen Gestaltungsmöglichkeiten
  • erstellen Sie ein Markdown, in dem Sudoku installiert, aufgerufen, ein Sudokum generiert und seine Lösung gefunden wird.
  • lassen Sie eines Ihrer Markdown Dokumente in verschiedenen Formaten erzeugen (HTML, PDF, Word)
  • lassen Sie sich inspirieren von https://holtzy.github.io/Pimp-my-rmd/ spielen Sie mit den dort vorgestellten Tipps und Tricks

check

  • habe ich die Grundidee von R-Markdown verstanden?
  • sind mir die Vorteile klar?
  • weiß ich, was “rendern” ist und wie ich aus meiner RMD-Datei neue Formate generiere?
  • kann ich das auf dem Lehre-Server?
  • könnte ich ggf. eine komplette Forschungsarbeit (wenn ich mag inkl. Literaturverzeichnis) damit erstellen?

Datentransformation

In der Unit Transformation wird auf die beiden im Weiteren dargestellten zwei Transformationsmöglichkeiten verzweigt. Darüber hinaus werden einige weitere Themen der Datentransformation angerissen und verlinkt.

Datentransformation Base System

In eigener Unit Transformation Base

Aufgaben

Rechenarten, Variablen, Funktion(), Array, Slice eines Array, Funktionen auf Arrays

  • machen Sie sich ein wenig mit der R-Console vertraut (Befehle, Befehle wiederholen, Befehlszeile editieren etc.)
  • suchen Sie im Web nach R-Beispielcode und lassen Sie ihn in der Console laufen
  • erstellen Sie ein paar Variablen und verwenden Sie sie für Rechenvorgänge oder andere Operationen
  • erstellen Sie Variablen verschiedenen Typs
  • erstellen Sie eine Variable, die 10 Zahlen als Vector enthält.
  • greifen Sie auf die erste Zahl zu
  • greifen Sie auf die Zahlen in Position 4,5,6,7,8 zu
  • erstellen Sie ein Array mit Gewichten von kleinen Personen
  • führen Sie ein paar Operationen nach Wahl mit dem Array durch - welche Effekte haben die Operationen?
  • ermitteln Sie ein paar deskriptive, statistische Kennwerte für dieses Array (suchen Sie ggf. Hilfe hierfür)
  • lassen Sie die ersten 3 Werte des Arrays ausgeben
  • ermitteln Sie ein paar deskriptive, statistische Kennwerte für dieses Teilarray
  • erstellen Sie ein Array mit Größen von Personen, die zum obigen Gewichtsarray passen könnten
  • berechnen Sie die Korrelation (suchen Sie ggf. Hilfe, wie eine Korrelation in R berechnet wird)
  • erstellen Sie ein R-Skript, mit dem die obigen Aufgaben erledigt werden können
  • integrieren Sie vorherige Befehle in das Skript, auch aus der History
  • kommentieren Sie im Skript, z. B. was mit welcher Absicht passiert
  • testen Sie die Editier-Möglichkeiten im Skript, z. B. suchen, ersetzen, in Teilbereich mehrfach ersetzen,
  • lassen Sie eine Zeile, Teile des Skripts und das Gesamtskript laufen - beobachten Sie die Effekte in der Console
  • speichern Sie das Skript

Working Directory, Data I/O, Import Data, Export Data, DataFrame, Dataframe-Zugriff via $, nur prinzipiell Slicing bei DataFrames, cbind

  • erzeugen Sie ein vorher auf dem persönlichen P: Laufwerk ein Unterverzeichnis und machen Sie es zum working directory
  • speichern Sie ein R-Skript in diesem Verzeichnis
  • schließen Sie RStudio (speichern Sie ggf. noch offene Dateien) und öffnen Sie es erneut - welches working directory ist aktiv?
  • schließen Sie RStudio und öffnen Sie dann eine gespeicherte R-Datei mit Rechtsklick und Auswahl von RStudio - welches working directory ist aktiv?
  • laden Sie eine der Übungsdateien - machen Sie sich die Datenstruktur klar
  • laden Sie eine der Übungsdateien via R-Syntax
  • setzen Sie das working directory auf Ihr P: Laufwerk, laden Sie eine der Übungsdateien via R-Syntax aus dem Web und speichern Sie sie via R-Syntax in Ihrem working directory
  • experimentieren Sie ggf. mit verschiedenen Möglichkeiten beim Laden und machen Sie sich den Effekt auf den dataframe kar
  • speichern Sie diese Datei in einem beliebigen Verzeichnis auf Ihrem P: Laufwerk
  • speichern Sie diese Datei via R-Syntax auf Ihrem P: Laufwerk
  • experimentieren Sie mit verschiedenen Dateiformaten (.txt, .csv, *.RData)
  • ermitteln Sie verschiedene, descriptive Kenngrößen von einzelnen Spalten (Variablen) des Dataframes.
  • tun Sie dasselbe für Teilspalten (z. B. die ersten 5 oder die letzten 10 Beobachtungen)
  • speichern Sie einen Teil des Dataframes in einer neuen Variablen (Ausschnitt Ihrer Wahl)
  • erzeugen Sie aus zwei oder mehr Spalten (Variablen) einem neuen Dataframe und speichern Sie ihn unter einem neuen Namen
  • erzeugen Sie verschiedene Arrays via R-Syntax, erzeugen Sie hieraus einem Dataframe und speichern Sie ihn auf Ihrem P: Laufwerk
  • erstellen/speichern Sie auf Ihrem persönlichen ownCloud Speicher ein Datenfile. Es kann eines der hier zur Verfügung gestellten sein. Erzeugen Sie eine öffentliche Verknüpfung hierauf. Lesen Sie dieses Datenfile direkt von Ihrem ownCloud-Speicher in R ein.

check

  • warum sollte ich Slicing und Transformationen des Base System kennen, wo es doch Alternativen wie dplyr gibt?
  • Base Transformationen sind oft knapper, mächtiger aber auch kryptischer, schwerer zu verstehen, unübersichtlicher und fehleranfälliger

Datentransformation mit Tidyverse’s dplyr

In eigener Unit dplyr

check

  • warum sollte ich etwas darüber wissen?
  • was hat das mit Nachvollziehbarkeit (reproducibility) zu tun?
  • Slicing
  • Generieren, Modifizieren von Variablen/Spalten
  • Aggregieren von Werten, über Spalten und über Beobachtungen
  • differenzierter Zugriff auf Teildaten, differenziertes Verändern von Teildaten,
  • bedingter Zugriff, bedingte Modifikationen
  • prinzipieller Unterschied zwischen Möglichkeiten des Base-Systems und Tidyverse’s `dplyr’?
  • hier ganz besonders wichtig: Masking von Befehlen (select, mutate, filter, …)

Mini Beispiel jump_in

Datenfile in verschiedenen Formaten

R-Script - jump_in.R

Rmd-Datei - Source Code: jump_in.Rmd - gerendert als HTML

Übungs-Datensätze

Ein paar Übungs-Datensätze von Matthias Lippold

Ein Beispiel-Datensatz zum Berechnen des BMI v_bmi.txt

Ein studentischer Beispiel-Datensatz stud_utf8.txt

Ein Datensatz mit Big-Five Daten (aus dem Tutorial von Christian Treffenstädt) im CSV-Format: Big5_GEMI_R.csv

Swirl

Swirl is a platform for learning (and teaching) statistics and R simultaneously and interactively.

Viele Kurse können über die Swirl Website heruntergeladen werden.

Birk Oelhoff hat eine eigene Einführungseinheit in Swirl gebaut. Sie ist zu finden unter: https://pzezula.pages.gwdg.de/swirl/sheet_swirl.html

Bücher

Hadley Wickhams R for Data Sciences, Online Book

Hadley Wickhams Advanced R, Online Book

verschiedene Listen mit Kommandos

Die Cheat-Sheets von R-Studio (R-Studio | Help | Cheatsheets)

Die Befehle im R Base Packagelibrary(help = "base")

Google search ‘rstudio command list’

uni Idaho personality-project

Version: 12 April, 2021 09:38