Matrizen

matrix_data <- rep(c(1, 2, 3), times = 3)
m <- matrix(data = matrix_data, ncol = 3, nrow = 3)
m <- matrix(data = c(1:9), ncol = 3)
m 

Zeilen- und Spaltennamen

Hinzufügen einer Beschriftung der Reihen

rownames(m) <- c("a", "b", "c") 

Beschriftung der Spalten

colnames(m) <- c("one", "two", "three") 
m

Oder man könnte Zeilen- und Spaltennamen von Anfang an hinzufügen ...

m <- matrix(
  matrix_data,
  ncol = 3,
  dimnames = list(c("a", "b", "c"), c("one", "two", "three"))
)

Indizierung von Matrizen

Indizierung wie bei Vektoren über eckige Klammern, allerdings unter Angabe von zwei Werten (kommagetrennt).

m[1,1] # Wert der ersten Reihe, erste Spalte
m[1,2]
m[2,3] # 
m[,2] # die zweite Spalte

Indizierung von Matrizen II

m[,"one"] # Indizierung über Spaltenbeschriftung
is(m[,"one"]) # man sollte immer wissen was man bekommt!
m[,c("one", "two")]
is(m[,c("one", "two")])

Rechnen mit Matrizen

rowSums(m) # Reihensummen
colSums(m) # Spaltensummen

Vorausblick: Eine wirklich sehr "R"-artige Arbeitsweise mit Matrizen ist, zeilen- oder spaltenweise Funktionen anzuwenden

apply(m, 1, mean) # Mittelwert zeilenweise
colmeans <- apply(m, 2, mean) # Mittelwert reihenweise

Listen

Listen sind komplexe Datenstrukturen, in die beliebige andere Formate eingespeist werden. Sehr praktisch! Prinzip Apothekerschrank.

fgw_exp <- c(39, 16, 9, 5, 7, 18, 6)
parties <- c("CDU/CSU", "SPD", "AfD", "FDP", "LINKE", "GRÜNE", "Sonstige")
party_colors <- c("black", "red", "blue", "yellow", "pink", "green", "grey")
fgw <- list(
  party = parties,
  share = fgw_exp,
  color = party_colors
)
fgw

Listen (continued)

fgw[["share"]] # Zugriff auf ein Element der Liste
fgw$share # Zugriff mit Dollarzeichen
is(fgw$share)
is(fgw$color)
names(fgw)

Listen (final)

length(fgw)
length(fgw[[1]])

Ausblick: Nichts ist so "R"-ish wie lapply

lapply(fgw, length)

Zwei data.frame Klassiker

head(iris)
head(mtcars)

Ein data.frame ist nur eine Liste!

df <- data.frame(fgw)
is(df)
df[["share"]]
df$share

data.frame: Basics

.pull-left[

nrow(df)
ncol(df)
dim(df)
colnames(df)
rownames(df)

]

.pull-right[

df[, c("party", "share")]
df[1:3,]

]


data.frame: Subsetting

Subsetting über Indizierung

df[df$share > 10,]

Subsetting mit der subset()-Funktion

subset(df, share > 10)

Mein erster "echter" data.frame

library(gles)
data(bt2013) # see questionnaire("bt2013")
dim(bt2013)
party_vote <- bt2013[["v11aa"]]
party_vote_min <- party_vote[!is.na(party_vote)]
round(table(party_vote_min) / length(party_vote_min) * 100, 2)

Übungsaufgaben


  1. Welcher Anteil der Befragten ist über 20/30/40/50/60/70?
  2. Wie gestaltet sich die Alterstruktur der AfD-Wähler?

Wenn Sie möchten ... gerne Antwort mit Balkendiagramm!


Ausblick: Webscraping ist einfach

fgw_url <- "https://www.wahlrecht.de/umfragen/politbarometer.htm"
xml <- xml2::read_html(fgw_url)
tab <- rvest::html_table(xml, fill = TRUE)[[2]]

Szenario: Wahlkreisergebnisse

(Mögliches Ziel: Visualisierung der Wahlbeteiligung in Wahlkreisen in Balkendiagramm in absteigender Reihenfolge)

# Wir hollen Tabelle in Rohformat von Internet-Seite des Bundeswahlleiters geholt werden
btw2013url <- "https://www.bundeswahlleiter.de/dam/jcr/2ace94c3-15cb-476b-aa98-806b97209353/btw13_kerg.csv"
bt13raw <- read.table(btw2013url, header = T, skip = 2, fileEncoding = "ISO-8859-1", sep = ";")
bt13 <- bt13raw[3:nrow(bt13raw),] # Zeilen 1 und 2 loswerden
bt13min <- bt13[, c("Gebiet", "gehört", "Wahlberechtigte", "Wähler")]
bt13min[, "Wahlberechtigte"] <- as.numeric(as.vector(bt13min[,"Wahlberechtigte"]))
bt13min[, "Wähler"] <- as.numeric(as.vector(bt13min[,"Wähler"]))
bt13min[["Wahlbeteiligung"]] <- bt13min[["Wähler"]] / bt13min[["Wahlberechtigte"]]
head(bt13min, n = 3)


ablaette/learningR documentation built on July 1, 2023, 1:11 a.m.