Daten einlesen

R kann alle gängigen Datenformate einlesen. Häufig empfiehlt es sich jedoch, die Daten bereits z.B. aus Excel heraus als .txt Datei zu exportieren.

Erforderliche Pakete laden

library(readxl); library(haven)

Textdatei / CSV Datei einlesen

# Tabulator 
data <- read.table(file="https://mmi.psycho.unibas.ch/r-toolbox/data/RoleSat.txt", header=TRUE)

# Komma
data <- read.table(file="https://mmi.psycho.unibas.ch/r-toolbox/data/mtcars.csv", header=TRUE)

Excel Datei einlesen

library(readxl)
download.file("https://mmi.psycho.unibas.ch/r-toolbox/data/mtcars.xlsx", destfile = "mtcars.xlsx") # !! Dieser Teil ist nur für das Beispiel notwenig !!
data <- read_excel(path="mtcars.xlsx", sheet = 1, col_names = TRUE) # Wir möchten das Sheet 1 laden und berücksichtigen die Variablennamen in der Kopfzeile
## New names:
## * `` -> ...1

SPSS Datei einlesen

library(haven)
data <- read_sav("https://mmi.psycho.unibas.ch/r-toolbox/data/Cars.sav")

Daten umwandeln

Erforderliche Pakete laden

library(lsr)  # Umwandlung des Datensatzes von wide in long

Häufigkeiten

Struktur 1: Pro Proband eine Zeile

Bei unseren Funktionen für die Auswertung von Häufigkeitsdaten (z.B. Balkendiagramm, Liniendiagramm, Vierfeldertest, Korrespondenzanalyse, etc.), gehen wir davon aus, dass im Datensatz pro Proband eine Zeile und pro Variable eine Spalte verwendet wird. In Zeitschriften, Lehrbüchern und Übungen werden Häufikeitsdaten jedoch meistens als Häufigkeitstabellen dargestellt. Die Eingabe von Häufigkeitstabellen ist weniger aufwendig. Deshalb zeigen wir für die wichtigsten Varianten anhand von Beispielen die Umwandlung von Häufigkeitstabellen in Struktur 1.
Der umzuwandelnde Datensatz heisst “data1”, der umgewandelte Datensatz heisst "data.

Struktur 2: Eine oder mehrere nominale Variablen und eine Variable mit den Häufigkeiten.

Beispiel für zwei nominale Variablen:

# Dateneingabe
Reason <- rep(c("money","future","unemployment","circumstances","hard","economic","egoism","employment","finances","war","housing","fear","health","work"),5)
Education <- rep(c("unqualified","cep","bepc","high_school_diploma","university"), each=14)
Häufigkeit <- c(51,53,71,1,7,7,21,12,10,4,8,25,18,35,64,90,111,7,11,13,37,35,7,7,22,45,27,61,32,78,50,5,4,12,14,19,7,7,7,38,20,29,29,75,40,5,3,11,26,6,3,6,10,38,19,14 ,17,22,11,4,2,11,9,7,1,2,5,13,9,12)
data1 <- data.frame(Reason, Education, Häufigkeit)

# Erste 6 Zeilen des Datensatzes vor dem Umwandeln
head(data1)
##          Reason   Education Häufigkeit
## 1         money unqualified         51
## 2        future unqualified         53
## 3  unemployment unqualified         71
## 4 circumstances unqualified          1
## 5          hard unqualified          7
## 6      economic unqualified          7
# Name der Variable mit den Häufikeiten
Häufigkeiten <- "Häufigkeit"

# Den Datensatz in Struktur 1 umwandeln
countsToCases <- function(x, countcol = Häufigkeiten) {
idx <- rep.int(seq_len(nrow(x)), x[[countcol]]); x[[countcol]] <- NULL; x[idx, ]}
data <- as.data.frame(countsToCases(data1))

# Erste 6 Zeilen des Datensatzes nach dem Umwandeln
head(data)
##     Reason   Education
## 1    money unqualified
## 1.1  money unqualified
## 1.2  money unqualified
## 1.3  money unqualified
## 1.4  money unqualified
## 1.5  money unqualified


Struktur 3: Kreuztabelle

Kleine Kreuztabellen kann man direkt im Editor eingeben und anschliessend in Struktur 1 umwandeln.
Beispiel:

# Dateneingabe
data1 <- matrix(c(12, 80, 30,
                  20, 70, 50,
                  35, 50, 30,
                  40, 55, 28), ncol=3, byrow=TRUE)
dimnames(data1) <- list(Altersklasse=c("10-12", "13-15", "16-18", "19-21"), Deutungsart= c("Mensch", "Tier", "Pflanze"))

# Datensatz vor dem Umwandeln
data1
##             Deutungsart
## Altersklasse Mensch Tier Pflanze
##        10-12     12   80      30
##        13-15     20   70      50
##        16-18     35   50      30
##        19-21     40   55      28
# Den Datensatz in Struktur 1 umwandeln
data <- as.data.frame.table(data1)
countsToCases <- function(x, countcol = "Freq") {
  idx <- rep.int(seq_len(nrow(x)), x[[countcol]]); x[[countcol]] <- NULL; x[idx, ]}
data <- countsToCases(data)

# Erste 6 Zeilen des Datensatzes nach dem Umwandeln
head(data)
##     Altersklasse Deutungsart
## 1          10-12      Mensch
## 1.1        10-12      Mensch
## 1.2        10-12      Mensch
## 1.3        10-12      Mensch
## 1.4        10-12      Mensch
## 1.5        10-12      Mensch


Für grosse Kreuztabellen empfiehlt sich die Eingabe in EXCEL. In der ersten Spalte stehen die Stufen des Faktors, welcher die Zeilen definiert (oberste Zelle leer), in der ersten Zeile die Stufen des Faktors, welcher die Spalten definiert, und in den Zellen die Häufigkeiten. Die Tabelle als “Tabstoppgetrennter Text (.txt)” speichern und mit “read.table()” in R einlesen. Die Bezeichnungen für den Zeilen- und den Spaltenfaktor werden unter “Faktornamen spezifizieren” eingegeben.
Beispiel:

# Dateneingabe
data1 <- read.table("https://mmi.psycho.unibas.ch/r-toolbox/data/children2.txt", header=TRUE)       # Datensatz children2 laden

# Datensatz vor dem Umwandeln
data1
##               unqualified cep bepc high_school_diploma university
## money                  51  64   32                  29         17
## future                 53  90   78                  75         22
## unemployment           71 111   50                  40         11
## circumstances           1   7    5                   5          4
## hard                    7  11    4                   3          2
## economic                7  13   12                  11         11
## egoism                 21  37   14                  26          9
## employment             12  35   19                   6          7
## finances               10   7    7                   3          1
## war                     4   7    7                   6          2
## housing                 8  22    7                  10          5
## fear                   25  45   38                  38         13
## health                 18  27   20                  19          9
## work                   35  61   29                  14         12
# Faktornamen spezifizieren
Zeilenfaktor <- "Reason"
Spaltenfaktor <- "Education"

# Den Datensatz in Struktur 1 umwandeln
data <- as.data.frame.table(as.matrix(data1))
names(data)[1:2] <- c(Zeilenfaktor, Spaltenfaktor)
countsToCases <- function(x, countcol = "Freq") {
  idx <- rep.int(seq_len(nrow(x)), x[[countcol]]); x[[countcol]] <- NULL; x[idx, ]}
data <- countsToCases(data)

# Erste 6 Zeilen des Datensatzes nach dem Umwandeln
head(data)
##     Reason   Education
## 1    money unqualified
## 1.1  money unqualified
## 1.2  money unqualified
## 1.3  money unqualified
## 1.4  money unqualified
## 1.5  money unqualified

Abhängige Stichproben

Daten von Designs mit abhängigen Stichproben können im Wide- oder im Long-Format eingegeben werden. Im Wide-Format wird pro Proband nur eine Zeile verwendet. Das hat zur Folge, dass für jede Stufe eines Faktors mit abhängigen Stichproben eine Spalte verwendet werden muss. Bei unseren Funktionen für Varianzanalysen und t-Tests mit abnhängigen Stichproben gehen wir von dieser Datenstruktur aus. Der Benutzer muss dann keine Umstrukturierung der Daten vornehmen. Wenn man jedoch ausgehend von einem Datensatz im Wide-Format Grafiken oder Tabellen von Kennwerten erstellen will, ist es hilfreich, den Datensatz zuerst in das Long-Format zu umzuwandeln.
Der umzuwandelnde Datensatz heisst “data1”, der umgewandelte Datensatz heisst "data.

Datensatz vom Wide- in das Long-Format umwandeln

Damit die für die Umwandlung verwendete Funktion lsr() korrekt arbeitet, müssen die Namen von Faktoren mit abhängigen Stichproben folgenden Aufbau haben: Name.AV_Stufe.wsFaktor1_Stufe.wsFaktor2
Beispiel mit zwei Within-Faktoren und einem Between-Faktor:

# Dateneingabe
Testangst <- rep(c("hoch", "niedrig"), c(6,6))
Testleistung_verbal_Einzeltest <- c(99, 102,  97, 104, 103,  97, 107, 109, 104, 110, 102, 105)
Testleistung_verbal_Gruppentest <- c(104, 103, 101, 106, 106,  99, 103, 104, 105, 105,  99, 102)
Testleistung_praktisch_Einzeltest <- c(102, 101, 103, 107, 104, 104, 104, 104, 106, 104, 102, 102)
Testleistung_praktisch_Gruppentest <- c(106, 104, 104, 112, 109, 103,  98, 106, 102, 103,  96,  99)
data1 <- data.frame(Testangst, Testleistung_verbal_Einzeltest, Testleistung_verbal_Gruppentest, Testleistung_praktisch_Einzeltest, Testleistung_praktisch_Gruppentest)

# Datensatz vor dem Umwandeln
data1
##    Testangst Testleistung_verbal_Einzeltest Testleistung_verbal_Gruppentest
## 1       hoch                             99                             104
## 2       hoch                            102                             103
## 3       hoch                             97                             101
## 4       hoch                            104                             106
## 5       hoch                            103                             106
## 6       hoch                             97                              99
## 7    niedrig                            107                             103
## 8    niedrig                            109                             104
## 9    niedrig                            104                             105
## 10   niedrig                            110                             105
## 11   niedrig                            102                              99
## 12   niedrig                            105                             102
##    Testleistung_praktisch_Einzeltest Testleistung_praktisch_Gruppentest
## 1                                102                                106
## 2                                101                                104
## 3                                103                                104
## 4                                107                                112
## 5                                104                                109
## 6                                104                                103
## 7                                104                                 98
## 8                                104                                106
## 9                                106                                102
## 10                               104                                103
## 11                               102                                 96
## 12                               102                                 99
# Variablen spezifizieren
between <- c("Testangst")       # Between-Faktoren: gleich wie im Datensatz. Falls keine: between <- NULL
within <- c("Intelligenz","Testsituation")  # Within-Faktoren: Abfolge gemäss Variabennamen im Datensatz!
AV <- "Testleistung"                        # Abhängige Variable: gleich wie im Datensatz

# Einfügen der Spalte "Block" mit den Probanden-IDs
data1$Block <- as.factor(1:nrow(data1))
# Umwandlung des Datensatzes von wide in long
library(lsr)
data <- wideToLong(data1, within=within)

# Erste 6 Zeilen des Datensatzes nach dem Umwandeln
head(data)
##   Testangst Block Testleistung Intelligenz Testsituation
## 1      hoch     1           99      verbal    Einzeltest
## 2      hoch     2          102      verbal    Einzeltest
## 3      hoch     3           97      verbal    Einzeltest
## 4      hoch     4          104      verbal    Einzeltest
## 5      hoch     5          103      verbal    Einzeltest
## 6      hoch     6           97      verbal    Einzeltest


Datensatz vom Long- in das Wide-Format umwandeln

Beispiel mit zwei Within-Faktoren und einem Between-Faktor:

# Dateneingabe (Rücktransformation des obigen Beispiels)
data1 <- data

# Erste 6 Zeilen des Datensatzes vor dem Umwandeln
head(data1)
##   Testangst Block Testleistung Intelligenz Testsituation
## 1      hoch     1           99      verbal    Einzeltest
## 2      hoch     2          102      verbal    Einzeltest
## 3      hoch     3           97      verbal    Einzeltest
## 4      hoch     4          104      verbal    Einzeltest
## 5      hoch     5          103      verbal    Einzeltest
## 6      hoch     6           97      verbal    Einzeltest
# Links Name der abhängigen Variablen, rechts Namen der Faktoren mit abhängigen Stichproben
Formel <- Testleistung~Intelligenz+Testsituation

# Umwandlung des Datensatzes von long in wide
library(lsr)
data <- longToWide(data1, Formel)

# Datensatz vor dem Umwandeln
data
##    Testangst Block Testleistung_verbal_Einzeltest
## 1       hoch     1                             99
## 2       hoch     2                            102
## 3       hoch     3                             97
## 4       hoch     4                            104
## 5       hoch     5                            103
## 6       hoch     6                             97
## 7    niedrig     7                            107
## 8    niedrig     8                            109
## 9    niedrig     9                            104
## 10   niedrig    10                            110
## 11   niedrig    11                            102
## 12   niedrig    12                            105
##    Testleistung_verbal_Gruppentest Testleistung_praktisch_Einzeltest
## 1                              104                               102
## 2                              103                               101
## 3                              101                               103
## 4                              106                               107
## 5                              106                               104
## 6                               99                               104
## 7                              103                               104
## 8                              104                               104
## 9                              105                               106
## 10                             105                               104
## 11                              99                               102
## 12                             102                               102
##    Testleistung_praktisch_Gruppentest
## 1                                 106
## 2                                 104
## 3                                 104
## 4                                 112
## 5                                 109
## 6                                 103
## 7                                  98
## 8                                 106
## 9                                 102
## 10                                103
## 11                                 96
## 12                                 99