diff --git a/.RData b/.RData deleted file mode 100644 index edf1e33..0000000 Binary files a/.RData and /dev/null differ diff --git a/.Rhistory b/.Rhistory deleted file mode 100644 index f7b19bd..0000000 --- a/.Rhistory +++ /dev/null @@ -1,423 +0,0 @@ -do.call(sqrt,4) -do.call(sqrt,list(4)) -pi |> sqrt -pi |> sqrt() -l1 = seq(0,2*pi,length=100) -l1.length -l1.length() -l1$length -l1 -length(l1) -plot(l1,) -sin = sin(x) -sin = sin(l1) -plot(x,sin, type="l") -plot(l1,sin, type="l") -carsten = sin(l1) -plot(carsten,sin, type="l") -plot(l1,carsten, type="l") -?rep -# Ihre Lösung -data.frame(seq(0:10)) -# Ihre Lösung -data.frame(seq(0:10), seq(3,4)) -# Ihre Lösung -data.frame(seq(0:10), seq(0:10)) -wort = rep("Wort",100) -data.frame(zahl,wort) -df.head() -df <- data.frame(zahl,wort) -# Ihre Lösung -zahl <- seq(5,25,length=100) -hl <- seq(5,25,length=100) -wort <- rep("Wort",100) -df <- data.frame(zahl,wort) -df.head() -head(df) -head(df,10) -res = df[[67]] -res = df -df -res = df$zahl -res -res = df$zahl[[67]] -res -print(round(res,2)) -# Ihre Lösung: -M -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -M -?apply -# Ihre Lösung: -apply(M,sum) -```{r} -# Ihre Lösung: -apply(M,M[:,2],sum) -# Ihre Lösung: -apply(M,M[1],sum) -# Ihre Lösung: -apply(M,M[2],sum) -# Ihre Lösung: -apply(M,M[3],sum) -# Ihre Lösung: -apply(M,M[1],sum) -# Ihre Lösung: -apply(M,M[2],sum) -# Ihre Lösung: -apply(M,M[2],sum) -# Ihre Lösung: -apply(M,M[1],sum) -# Ihre Lösung: -apply(M,M[1],sum) -# Ihre Lösung: -apply(M,c(1,2),sum) -apply(M,c(1,2),sum) -apply(M,2,sum) -k = M[:,5] -k = M[,5] -k -length(k) -sum(k) -k = M[,1] -k -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -apply(M,2,sum) -k = M[,1] -sum(k) -apply(M,2,sqrt) -0 -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 = function(a){ -if (a == 2){ -return 1 -1 -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 = function(a){ -if (a == 2){ -1 -} -0 -} -apply(M,2,sum) -apply(M,2,count_2) -?sqrt -count_2(3) -count_2(2) -0 -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 = function(a){ -if (a == 2){ -1 -} -else{ -0 -} -} -apply(M,2,count_2) -count_2(2) -?apply -```{r} -0 -?all -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -print(typeof(a)) -} -apply(M,2,count_2) -count_2(2) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -print(typeof(a)) -print(length(a)) -} -apply(M,2,count_2) -count_2(2) -apply(M,2,count_2) -sum(a) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -sum(a) -} -apply(M,2,count_2) -a[[a==2]] -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a[[a==2]] -} -apply(M,2,count_2) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a -} -apply(M,2,count_2) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a -} -res = apply(M,2,count_2) -res -?sum -?count -a==2 -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -res -num_2 = apply(M,2,sum) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -num_2 = apply(M,2,sum) -num_2 -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -num_2 = apply(res,2,sum) -num_2 -2_in_r5 = num2[[5]] -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -num_2 = apply(res,2,sum) -2in_r5 = num2[[5]] -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -num_2 = apply(res,2,sum) -two_in_r5 = num2[[5]] -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -num_2 = apply(res,2,sum) -two_in_r5 = num_2[[5]] -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -z = apply(res,2,sum) -two_in_r5 = z[[5]] -print("Es gibt {two_in_r5} ") -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -z = apply(res,2,sum) -two_in_r5 = z[[5]] -print(paste0("Es gibt", two_in_r5) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -z = apply(res,2,sum) -two_in_r5 = z[[5]] -print(paste0("Es gibt", two_in_r5)) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -z = apply(res,2,sum) -two_in_r5 = z[[5]] -print(paste0("Es gibt ", two_in_r5, " in Spalte 5")) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -a==2 -} -res = apply(M,2,count_2) -z = apply(res,2,sum) -two_in_r5 = z[[5]] -print(paste0("Es gibt ", two_in_r5, " 2er in Spalte 5")) -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -sum(a==2) -} -res = apply(M,2,count_2) -z = apply(res,2,sum) -res -set.seed(12) # Zufallszahlengenerator gleich machen. -M = matrix(sample(c(1, 2, 3), 10 * 100, T), nrow = 100) -# Ihre Lösung: -count_2 <- function(a){ -sum(a==2) -} -z = apply(M,2,count_2) -print(paste0("Es gibt ", z[[5]], " 2er in Spalte 5")) -seq(1, 10, length.out = 20) -length(seq(1, 10, length.out = 20)) -r = seq(1, 10, length = 20) -r -r = seq(1, 10, by=0.5) -r -r = seq(0, 10, length = 20) -r -r = seq(1, 10, length = 21) -r -r = seq(0, 10, length.out = 20) -r -r = seq(0, 10, length.out = 10) -r -r = seq(1, 10, length.out = 10) -r -r = seq(1, 10, length.out = 20) -r -setwd("~/Documents/Masterstudium/1.Semester/DSR") -git pulll -clear() -if (min >= max) { -stop("min muss kleiner als max sein.") -} -# Bitte mit echter Lösung in myhistogram.R ersetzen: -myhistogram = function(x, n, min, max) { -if (missing(min)) min <- base::min(x) -if (missing(max)) max <- base::max(x) -if (missing(n)) n <- 10 -if (min >= max) { -stop("min muss kleiner als max sein.") -} -range <- min + max -interval_ranges <- (max - min) / n -borders <- seq(min, max, length.out = n + 1) -counts <- rep(0, n) -for(value in x) { -for (i in 1:n){ -if (value >= borders[i] && value < borders[i+1]){ -counts[i] <- counts[i] + 1 -break -} -} -} -print(paste("Intervallgrößen: ", interval_ranges)) -list(borders=borders, counts = counts) -} -x = seq(-5, 6, by = 1 / 3) -l = myhistogram(x) -print(l$borders) -print(l$counts) -setwd("~/Documents/Masterstudium/1.Semester/DSR_Testate") -# Bitte mit echter Lösung in myhistogram.R ersetzen: -myhistogram = function(x, n, min, max) { -if (missing(min)) min <- base::min(x) -if (missing(max)) max <- base::max(x) -if (missing(n)) n <- 10 -if (min >= max) { -stop("min muss kleiner als max sein.") -} -range <- min + max -interval_ranges <- (max - min) / n -borders <- seq(min, max, length.out = n + 1) -counts <- rep(0, n) -for(value in x) { -for (i in 1:n){ -if (value >= borders[i] && value < borders[i+1]){ -counts[i] <- counts[i] + 1 -break -} -} -} -print(paste("Intervallgrößen: ", interval_ranges)) -list(borders=borders, counts = counts) -} -x = seq(-5, 6, by = 1 / 3) -l = myhistogram(x) -print(l$borders) -print(l$counts) -x = seq(-5, 6, by = 1 / 3) -l = myhistogram(x, n = 10, min = -5, max = 6) -solution = list( -borders = c(-5.0, -3.9, -2.8, -1.7, -0.6, 0.5, 1.6, 2.7, 3.8, 4.9, 6.0), -counts = c(4, 3, 3, 4, 3, 3, 4, 3, 3, 3) -) -print(l$borders) -print(l$counts) -set.seed(1) -x = rnorm(0, 1, n = 1000) -# h = myhistogram(x, n = 20) -# ggplot() + ... -# Bitte mit echter Lösung in myhistogram.R ersetzen: -myhistogram = function(x, n, min, max) { -if (missing(min)) min <- base::min(x) -if (missing(max)) max <- base::max(x) -if (missing(n)) n <- 10 -if (min >= max) { -stop("min muss kleiner als max sein.") -} -range <- min + max -interval_ranges <- (max - min) / n -borders <- seq(min, max, length.out = n + 1) -counts <- rep(0, n) -for(value in x) { -for (i in 1:n){ -if (value >= borders[i] && value < borders[i+1]){ -counts[i] <- counts[i] + 1 -break -} -} -} -print(paste("Intervallgrößen: ", interval_ranges)) -list(borders=borders, counts = counts) -} -x = seq(-5, 6, by = 1 / 3) -l = myhistogram(x) -print(l$borders) -print(l$counts) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d69e4b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ +# Created by https://www.toptal.com/developers/gitignore/api/r +# Edit at https://www.toptal.com/developers/gitignore?templates=r + +### R ### +# History files +.Rhistory +.Rapp.history + +# Session Data files +.RData +.RDataTmp + +# User-specific files +.Ruserdata + +# Example code in package build process +*-Ex.R + +# Output files from R CMD build +/*.tar.gz + +# Output files from R CMD check +/*.Rcheck/ + +# RStudio files +.Rproj.user/ + +# produced vignettes +vignettes/*.html +vignettes/*.pdf + +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 +.httr-oauth + +# knitr and R markdown default cache directories +*_cache/ +/cache/ + +# Temporary files created by R markdown +*.utf8.md +*.knit.md + +# R Environment Variables +.Renviron + +# pkgdown site +docs/ + +# translation temp files +po/*~ + +# RStudio Connect folder +rsconnect/ + +### R.Bookdown Stack ### +# R package: bookdown caching files +/*_files/ + +# End of https://www.toptal.com/developers/gitignore/api/r diff --git a/README.md b/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/Testat_1/Abgabe/DSR_Abgabe1_Gruppe1.pdf b/Testat_1/Abgabe/DSR_Abgabe1_Gruppe1.pdf new file mode 100644 index 0000000..99d3b36 Binary files /dev/null and b/Testat_1/Abgabe/DSR_Abgabe1_Gruppe1.pdf differ diff --git a/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd b/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd index 44ea79e..01dfec2 100644 --- a/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd +++ b/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd @@ -1,160 +1,175 @@ ---- -title: "Eigenes Histogramm" -output: - html_document: default - pdf_document: default ---- - -# Eigenes Histogramm - -Es soll ein eigenes Histogramm erzeugt werden. Der Dateiname für das Skript ist `myhistogram.R`. - -## Funktion `myhistogram` - -Programmieren Sie in R die Funktion `myhistogram`, die als Parameter `x` einen Vektor aus Zahlen erhält. Die Zahlen werden in `n` Intervalle einsortiert, und es wird gezählt, wie oft eine Zahl in einem Intervall vorkommt. Der Rückgabewert ist eine Liste mit den Einträgen `borders`, die die $n+1$ Intervallgrenzen enthalten und `counts`, der die Anzahlen enthält. - - * Die $n$ Intervalle sollen gleich groß sein ($\Delta b$), d.h. für die Intervallgrenzen $b_1, b_2, \ldots, b_{n+1}$ gilt $\frac{b_{i+1}-b_{i}}{n}=\Delta b$ für $i=1, 2, \ldots n$. - * Die äußeren Grenzen $b_1$ und $b_n$ sollen als optionale Parametern `min` und `max` an die Funktion übergeben werden. Werte aus `x`, die zu keinem Intervall gehören, sollen ignoriert werden. Es wird aber eine Warnung ausgegeben, die sagt, welche Zahlen außerhalb des Bereichs liegen. - * Eine Zahl $z$ gehört zum $i$-ten Intervall, falls $b_i \leq z < b_{i+1}$ gilt. - -Bis auf `x` sollen alle Parameter optional sein. Überlegen Sie sinnvolle Default-Werte. - -Es ist natürlich **nicht** erlaubt, in der eigenen Funktion andere Funktionen zu nutzen, die ein Histogramm erzeugen. - -Hier ein Beispiel: -```{r eval = T} -# Bitte mit echter Lösung in myhistogram.R ersetzen: -myhistogram = function(x, n, min, max) { - if (missing(min)) min <- base::min(x) - if (missing(max)) max <- base::max(x) - if (missing(n)) n <- 10 - - if (min >= max) { - stop("min muss kleiner als max sein.") - } - - range <- min + max - borders <- seq(min, max, length.out = n + 1) - counts <- rep(0, n) - - outside <- x[x < min | x >= max] - if (length(outside) > 0) { - warning(paste("Zahl(en) außerhalb Intervallgrenzen:", - paste(outside, collapse = ", "))) - } - - for(value in x) { - for (i in 1:n){ - if (value >= borders[i] && value < borders[i+1]){ - counts[i] <- counts[i] + 1 - break - } - } - } - - list(borders=borders, counts = counts) -} -x = seq(-5, 6, by = 1 / 3) - -l = myhistogram(x) -print(l$borders) -print(l$counts) -``` - - - -## Beispieldaten - -Hier zunächst zwei Beispiele. - -### Beispiel 1 - -Es wird eine Warnung ausgeben: -``` -## Warning in myhistogram(x, n = 10, min = -5, max = 6): Zahl(en) außerhalb -## Intervallgrenzen: 6 -``` - -```{r} -x = seq(-5, 6, by = 1 / 3) -l = myhistogram(x, n = 10, min = -5, max = 6) -solution = list( - borders = c(-5.0, -3.9, -2.8, -1.7, -0.6, 0.5, 1.6, 2.7, 3.8, 4.9, 6.0), - counts = c(4, 3, 3, 4, 3, 3, 4, 3, 3, 3) -) -print(l$borders) -print(l$counts) -``` - -### Beispiel 2 - -```{r} -x = seq(-5, 6, by = 1 / 3) -myhistogram(x, n = 5, min = -10, max = 10) -solution = list(borders = c(-10, -6, -2, 2, 6, 10), - counts = c(0, 9, 12, 12, 1)) -``` - -### Beispiel 3 - -Ganze Zahlen mit Wiederholungen, Default-Werte für `n`, `min` und `max`. Da $b_{n+1}$ selbst zu keinem Intervall gehört, wird das Maximum (10) als außerhalb gemeldet: - -```{r} -x = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10) -l = myhistogram(x) -print(l$borders) -print(l$counts) -``` - -### Beispiel 4 - -Werte unterhalb von `min` und oberhalb von `max` werden ignoriert und in der Warnung aufgelistet: - -```{r} -x = c(-3, -1, 0, 0.5, 1, 2.5, 4, 4.99, 5, 7) -l = myhistogram(x, n = 5, min = 0, max = 5) -solution = list(borders = c(0, 1, 2, 3, 4, 5), - counts = c(2, 1, 1, 0, 2)) -print(l$borders) -print(l$counts) -``` - -### Beispiel 5 - -Normalverteilte Zufallszahlen, deren Bereich vollständig innerhalb von `min` und `max` liegt (keine Warnung): - -```{r} -set.seed(42) -x = rnorm(100, mean = 0, sd = 1) -l = myhistogram(x, n = 8, min = -4, max = 4) -print(l$borders) -print(l$counts) -print(sum(l$counts)) # muss 100 ergeben -``` - - -## Barplot - -Nutzen Sie Ihre Funktion `myhistogram` und erzeugen Sie einen Barplot mit _ggplot_. Die _x_-Achse zeigt dabei die Mitte des Intervalls und die _y_-Achse die Anzahl der Elemente in dieser Klasse. - -Tipp: Der Parameter `stat` von `geom_bar` ist wichtig. - -Vervollständigen Sie den Chunk. Die Kommentare sollen zu Anweisungen umgewandelt werden: - -```{r} -library("ggplot2") -set.seed(1) -x = rnorm(0, 1, n = 1000) -h = myhistogram(x, n = 10) -bins = (h$borders[-1]+h$borders[-length(h$borders)])/2 # letzte und erste Grenze entfernen sodass nebeneinanderliegende Grenzen in den Vektoren jeweils auf der gleichen Indexposition liegen. Man verschiebt die Grenzen also - -#print(h$borders[-1]) -#print(h$borders[length(-h$borders)]) - -print(h$borders) -count = h$counts #/sum(h$counts) # Damit kann man die relative statt der absoluten Häufigkeit anzeigen -ggplot() + - geom_bar(aes(x=bins, y=count), stat="identity")+ - labs(title="Histogramm für normalverteilte Daten", y="Absolute Häufigkeit", x="Intervalle") - -``` +--- +title: "Eigenes Histogramm" +output: + pdf_document: default + html_document: default +--- + +# Eigenes Histogramm + +Es soll ein eigenes Histogramm erzeugt werden. Der Dateiname für das Skript ist `myhistogram.R`. + +## Funktion `myhistogram` + +Programmieren Sie in R die Funktion `myhistogram`, die als Parameter `x` einen Vektor aus Zahlen erhält. Die Zahlen werden in `n` Intervalle einsortiert, und es wird gezählt, wie oft eine Zahl in einem Intervall vorkommt. Der Rückgabewert ist eine Liste mit den Einträgen `borders`, die die $n+1$ Intervallgrenzen enthalten und `counts`, der die Anzahlen enthält. + + * Die $n$ Intervalle sollen gleich groß sein ($\Delta b$), d.h. für die Intervallgrenzen $b_1, b_2, \ldots, b_{n+1}$ gilt $\frac{b_{i+1}-b_{i}}{n}=\Delta b$ für $i=1, 2, \ldots n$. + * Die äußeren Grenzen $b_1$ und $b_n$ sollen als optionale Parametern `min` und `max` an die Funktion übergeben werden. Werte aus `x`, die zu keinem Intervall gehören, sollen ignoriert werden. Es wird aber eine Warnung ausgegeben, die sagt, welche Zahlen außerhalb des Bereichs liegen. + * Eine Zahl $z$ gehört zum $i$-ten Intervall, falls $b_i \leq z < b_{i+1}$ gilt. + +Bis auf `x` sollen alle Parameter optional sein. Überlegen Sie sinnvolle Default-Werte. + +Es ist natürlich **nicht** erlaubt, in der eigenen Funktion andere Funktionen zu nutzen, die ein Histogramm erzeugen. + +Hier ein Beispiel: +```{r eval = T} +# Bitte mit echter Lösung in myhistogram.R ersetzen: +myhistogram = function(x, n, min, max) { + if (missing(min)) min <- base::min(x) + + # sonst fällt max(x) wegen b_i <= z < b_{i+1} raus + if (missing(max)) max <- base::max(x) + 10^-12 + + if (missing(n)) n <- 10 + + if (min >= max) { + stop("min muss kleiner als max sein.") + } + + # Äquidistante Aufteilung der Eingabe in n Intervalle mit n + 1 Grenzen + borders <- seq(min, max, length.out = n + 1) + counts <- rep(0, n) + + # Werte außerhalb des gewählten Intervalls ermitteln + outside <- x[x < min | x >= max] + + if (length(outside) > 0) { + warning(paste("Zahl(en) außerhalb Intervallgrenzen:", + paste(outside, collapse = ", "))) + } + + for(value in x) { + for (i in 1:n){ + # Linke Grenze inklusive, rechte exklusive + # Deswegen wurde oben auf max 10^-12 addiert + if (value >= borders[i] && value < borders[i+1]) + { + counts[i] <- counts[i] + 1 + break + } + } + } + # Intervallgrenzen und absolute Häufigkeit zurückgeben + list(borders=borders, counts = counts) +} +x = seq(-5, 6, by = 1 / 3) + +l = myhistogram(x) +print(l$borders) +print(l$counts) +``` + + + +## Beispieldaten + +Hier zunächst zwei Beispiele. + +### Beispiel 1 + +Es wird eine Warnung ausgeben: +``` +## Warning in myhistogram(x, n = 10, min = -5, max = 6): Zahl(en) außerhalb +## Intervallgrenzen: 6 +``` + +```{r} +x = seq(-5, 6, by = 1 / 3) +l = myhistogram(x, n = 10, min = -5, max = 6) +solution = list( + borders = c(-5.0, -3.9, -2.8, -1.7, -0.6, 0.5, 1.6, 2.7, 3.8, 4.9, 6.0), + counts = c(4, 3, 3, 4, 3, 3, 4, 3, 3, 3) +) +print(l$borders) +print(l$counts) +``` + +### Beispiel 2 + +```{r} +x = seq(-5, 6, by = 1 / 3) +myhistogram(x, n = 5, min = -10, max = 10) +solution = list(borders = c(-10, -6, -2, 2, 6, 10), + counts = c(0, 9, 12, 12, 1)) +``` + +### Beispiel 3 + +Ganze Zahlen mit Wiederholungen, Default-Werte für `n`, `min` und `max` + +```{r} +x = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10) +l = myhistogram(x) +print(l$borders) +print(l$counts) +``` + +### Beispiel 4 + +Werte unterhalb von `min` und oberhalb von `max` werden ignoriert und in der Warnung aufgelistet: + +```{r} +x = c(-3, -1, 0, 0.5, 1, 2.5, 4, 4.99, 5, 7) + +# da max explizit gesetzt wird, fallen 5 und 7 aus den gütligen Grenzen raus +l = myhistogram(x, n = 5, min = 0, max = 5) +solution = list(borders = c(0, 1, 2, 3, 4, 5), + counts = c(2, 1, 1, 0, 2)) +print(l$borders) +print(l$counts) +``` + +### Beispiel 5 + +Normalverteilte Zufallszahlen, deren Bereich vollständig innerhalb von `min` und `max` liegt (keine Warnung): + +```{r} +set.seed(42) +x = rnorm(100, mean = 0, sd = 1) +l = myhistogram(x, n = 8, min = -4, max = 4) +print(l$borders) +print(l$counts) +print(sum(l$counts)) # muss 100 ergeben +``` + + +## Barplot + +Nutzen Sie Ihre Funktion `myhistogram` und erzeugen Sie einen Barplot mit _ggplot_. Die _x_-Achse zeigt dabei die Mitte des Intervalls und die _y_-Achse die Anzahl der Elemente in dieser Klasse. + +Tipp: Der Parameter `stat` von `geom_bar` ist wichtig. + +Vervollständigen Sie den Chunk. Die Kommentare sollen zu Anweisungen umgewandelt werden: + +```{r} +library("ggplot2") +set.seed(1) +x = rnorm(0, 1, n = 1000) +h = myhistogram(x) +# letzte und erste Grenze entfernen sodass nebeneinanderliegende Grenzen in den Vektoren +# jeweils auf der gleichen Indexposition liegen. Man verschiebt die Grenzen also +bins = (h$borders[-1]+h$borders[-length(h$borders)])/2 + +#print(h$borders[-1]) +#print(h$borders[length(-h$borders)]) + +print(h$borders) +# Damit kann man die relative statt der absoluten Häufigkeit anzeigen +count = h$counts #/sum(h$counts) + +ggplot() + + geom_bar(aes(x=bins, y=count), stat="identity")+ + labs(title="Histogramm für normalverteilte Daten", y="Absolute Häufigkeit", x="Intervalle") + +print(h$counts) +``` \ No newline at end of file diff --git a/Testat_1/Aufgabe_1/EigenesHistogramm.html b/Testat_1/Aufgabe_1/EigenesHistogramm.html index b4beeb6..547b14a 100644 --- a/Testat_1/Aufgabe_1/EigenesHistogramm.html +++ b/Testat_1/Aufgabe_1/EigenesHistogramm.html @@ -1,566 +1,579 @@ - - - - - - - - - - - - - -Eigenes Histogramm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - -
-

Eigenes Histogramm

-

Es soll ein eigenes Histogramm erzeugt werden. Der Dateiname für das -Skript ist myhistogram.R.

-
-

Funktion myhistogram

-

Programmieren Sie in R die Funktion myhistogram, die als -Parameter x einen Vektor aus Zahlen erhält. Die Zahlen -werden in n Intervalle einsortiert, und es wird gezählt, -wie oft eine Zahl in einem Intervall vorkommt. Der Rückgabewert ist eine -Liste mit den Einträgen borders, die die \(n+1\) Intervallgrenzen enthalten und -counts, der die Anzahlen enthält.

-
    -
  • Die \(n\) Intervalle sollen gleich -groß sein (\(\Delta b\)), d.h. für die -Intervallgrenzen \(b_1, b_2, \ldots, -b_{n+1}\) gilt \(\frac{b_{i+1}-b_{i}}{n}=\Delta b\) für -\(i=1, 2, \ldots n\).
  • -
  • Die äußeren Grenzen \(b_1\) und -\(b_n\) sollen als optionale Parametern -min und max an die Funktion übergeben werden. -Werte aus x, die zu keinem Intervall gehören, sollen -ignoriert werden. Es wird aber eine Warnung ausgegeben, die sagt, welche -Zahlen außerhalb des Bereichs liegen.
  • -
  • Eine Zahl \(z\) gehört zum \(i\)-ten Intervall, falls \(b_i \leq z < b_{i+1}\) gilt.
  • -
-

Bis auf x sollen alle Parameter optional sein. Überlegen -Sie sinnvolle Default-Werte.

-

Es ist natürlich nicht erlaubt, in der eigenen -Funktion andere Funktionen zu nutzen, die ein Histogramm erzeugen.

-

Hier ein Beispiel:

-
# Bitte mit echter Lösung in myhistogram.R ersetzen:
-myhistogram = function(x, n, min, max) {
-  if (missing(min)) min <- base::min(x)
-  if (missing(max)) max <- base::max(x)
-  if (missing(n)) n <- 10
-  
-  if (min >= max) {
-    stop("min muss kleiner als max sein.")
-  }
-
-  range <- min + max
-  borders <- seq(min, max, length.out = n + 1)
-  counts <- rep(0, n)
-  
-  outside <- x[x < min | x >= max]
-  if (length(outside) > 0) {
-    warning(paste("Zahl(en) außerhalb Intervallgrenzen:",
-                  paste(outside, collapse = ", ")))
-  }
-  
-  for(value in x) {
-    for (i in 1:n){
-      if (value >= borders[i] && value < borders[i+1]){
-        counts[i] <- counts[i] + 1
-        break
-      }
-    }
-  }
-  
-  list(borders=borders, counts = counts)
-}
-x = seq(-5, 6, by = 1 / 3)
-
-l = myhistogram(x)
-
## Warning in myhistogram(x): Zahl(en) außerhalb Intervallgrenzen: 6
-
print(l$borders)
-
##  [1] -5.0 -3.9 -2.8 -1.7 -0.6  0.5  1.6  2.7  3.8  4.9  6.0
-
print(l$counts)
-
##  [1] 4 3 3 4 3 3 4 3 3 3
-
-
-

Beispieldaten

-

Hier zunächst zwei Beispiele.

-
-

Beispiel 1

-

Es wird eine Warnung ausgeben:

-
## Warning in myhistogram(x, n = 10, min = -5, max = 6): Zahl(en) außerhalb
-## Intervallgrenzen: 6
-
x = seq(-5, 6, by = 1 / 3)
-l = myhistogram(x, n = 10, min = -5, max = 6)
-
## Warning in myhistogram(x, n = 10, min = -5, max = 6): Zahl(en) außerhalb
-## Intervallgrenzen: 6
-
solution = list(
-  borders = c(-5.0, -3.9, -2.8, -1.7, -0.6, 0.5, 1.6, 2.7, 3.8, 4.9, 6.0),
-  counts = c(4, 3, 3, 4, 3, 3, 4, 3, 3, 3)
-)
-print(l$borders)
-
##  [1] -5.0 -3.9 -2.8 -1.7 -0.6  0.5  1.6  2.7  3.8  4.9  6.0
-
print(l$counts)
-
##  [1] 4 3 3 4 3 3 4 3 3 3
-
-
-

Beispiel 2

-
x = seq(-5, 6, by = 1 / 3)
-myhistogram(x, n = 5, min = -10, max = 10)
-
## $borders
-## [1] -10  -6  -2   2   6  10
-## 
-## $counts
-## [1]  0  9 12 12  1
-
solution = list(borders = c(-10, -6, -2, 2, 6, 10),
-                counts = c(0, 9, 12, 12, 1))
-
-
-

Beispiel 3

-

Ganze Zahlen mit Wiederholungen, Default-Werte für n, -min und max. Da \(b_{n+1}\) selbst zu keinem Intervall -gehört, wird das Maximum (10) als außerhalb gemeldet:

-
x = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10)
-l = myhistogram(x)
-
## Warning in myhistogram(x): Zahl(en) außerhalb Intervallgrenzen: 10
-
print(l$borders)
-
##  [1]  1.0  1.9  2.8  3.7  4.6  5.5  6.4  7.3  8.2  9.1 10.0
-
print(l$counts)
-
##  [1] 1 2 3 4 1 1 1 1 1 0
-
-
-

Beispiel 4

-

Werte unterhalb von min und oberhalb von -max werden ignoriert und in der Warnung aufgelistet:

-
x = c(-3, -1, 0, 0.5, 1, 2.5, 4, 4.99, 5, 7)
-l = myhistogram(x, n = 5, min = 0, max = 5)
-
## Warning in myhistogram(x, n = 5, min = 0, max = 5): Zahl(en) außerhalb
-## Intervallgrenzen: -3, -1, 5, 7
-
solution = list(borders = c(0, 1, 2, 3, 4, 5),
-                counts = c(2, 1, 1, 0, 2))
-print(l$borders)
-
## [1] 0 1 2 3 4 5
-
print(l$counts)
-
## [1] 2 1 1 0 2
-
-
-

Beispiel 5

-

Normalverteilte Zufallszahlen, deren Bereich vollständig innerhalb -von min und max liegt (keine Warnung):

-
set.seed(42)
-x = rnorm(100, mean = 0, sd = 1)
-l = myhistogram(x, n = 8, min = -4, max = 4)
-print(l$borders)
-
## [1] -4 -3 -2 -1  0  1  2  3  4
-
print(l$counts)
-
## [1]  0  4 11 31 37 15  2  0
-
print(sum(l$counts))  # muss 100 ergeben
-
## [1] 100
-
-
-
-

Barplot

-

Nutzen Sie Ihre Funktion myhistogram und erzeugen Sie -einen Barplot mit ggplot. Die x-Achse zeigt dabei die -Mitte des Intervalls und die y-Achse die Anzahl der Elemente in -dieser Klasse.

-

Tipp: Der Parameter stat von geom_bar ist -wichtig.

-

Vervollständigen Sie den Chunk. Die Kommentare sollen zu Anweisungen -umgewandelt werden:

-
set.seed(1)
-x = rnorm(0, 1, n = 1000)
-# h = myhistogram(x, n = 20)
-# ggplot() + ...
-
-
- - - - -
- - - - - - - - - - - - - - - + + + + + + + + + + + + + +Eigenes Histogramm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+

Eigenes Histogramm

+

Es soll ein eigenes Histogramm erzeugt werden. Der Dateiname für das +Skript ist myhistogram.R.

+
+

Funktion myhistogram

+

Programmieren Sie in R die Funktion myhistogram, die als +Parameter x einen Vektor aus Zahlen erhält. Die Zahlen +werden in n Intervalle einsortiert, und es wird gezählt, +wie oft eine Zahl in einem Intervall vorkommt. Der Rückgabewert ist eine +Liste mit den Einträgen borders, die die \(n+1\) Intervallgrenzen enthalten und +counts, der die Anzahlen enthält.

+
    +
  • Die \(n\) Intervalle sollen gleich +groß sein (\(\Delta b\)), d.h. für die +Intervallgrenzen \(b_1, b_2, \ldots, +b_{n+1}\) gilt \(\frac{b_{i+1}-b_{i}}{n}=\Delta b\) für +\(i=1, 2, \ldots n\).
  • +
  • Die äußeren Grenzen \(b_1\) und +\(b_n\) sollen als optionale Parametern +min und max an die Funktion übergeben werden. +Werte aus x, die zu keinem Intervall gehören, sollen +ignoriert werden. Es wird aber eine Warnung ausgegeben, die sagt, welche +Zahlen außerhalb des Bereichs liegen.
  • +
  • Eine Zahl \(z\) gehört zum \(i\)-ten Intervall, falls \(b_i \leq z < b_{i+1}\) gilt.
  • +
+

Bis auf x sollen alle Parameter optional sein. Überlegen +Sie sinnvolle Default-Werte.

+

Es ist natürlich nicht erlaubt, in der eigenen +Funktion andere Funktionen zu nutzen, die ein Histogramm erzeugen.

+

Hier ein Beispiel:

+
# Bitte mit echter Lösung in myhistogram.R ersetzen:
+myhistogram = function(x, n, min, max) {
+  if (missing(min)) min <- base::min(x)
+  if (missing(max)) max <- base::max(x) + 10^-12 # sonst fällt max(x) wegen b_i <= z < b_{i+1} raus
+  if (missing(n)) n <- 10
+  
+  if (min >= max) {
+    stop("min muss kleiner als max sein.")
+  }
+
+  range <- min + max
+  borders <- seq(min, max, length.out = n + 1)
+  counts <- rep(0, n)
+  
+  outside <- x[x < min | x >= max]
+  if (length(outside) > 0) {
+    warning(paste("Zahl(en) außerhalb Intervallgrenzen:",
+                  paste(outside, collapse = ", ")))
+  }
+  
+  for(value in x) {
+    for (i in 1:n){
+      if (value >= borders[i] && value < borders[i+1]){
+        counts[i] <- counts[i] + 1
+        break
+      }
+    }
+  }
+  
+  list(borders=borders, counts = counts)
+}
+x = seq(-5, 6, by = 1 / 3)
+
+l = myhistogram(x)
+print(l$borders)
+
##  [1] -5.0 -3.9 -2.8 -1.7 -0.6  0.5  1.6  2.7  3.8  4.9  6.0
+
print(l$counts)
+
##  [1] 4 3 3 4 3 3 4 3 3 4
+
+
+

Beispieldaten

+

Hier zunächst zwei Beispiele.

+
+

Beispiel 1

+

Es wird eine Warnung ausgeben:

+
## Warning in myhistogram(x, n = 10, min = -5, max = 6): Zahl(en) außerhalb
+## Intervallgrenzen: 6
+
x = seq(-5, 6, by = 1 / 3)
+l = myhistogram(x, n = 10, min = -5, max = 6)
+
## Warning in myhistogram(x, n = 10, min = -5, max = 6): Zahl(en) außerhalb
+## Intervallgrenzen: 6
+
solution = list(
+  borders = c(-5.0, -3.9, -2.8, -1.7, -0.6, 0.5, 1.6, 2.7, 3.8, 4.9, 6.0),
+  counts = c(4, 3, 3, 4, 3, 3, 4, 3, 3, 3)
+)
+print(l$borders)
+
##  [1] -5.0 -3.9 -2.8 -1.7 -0.6  0.5  1.6  2.7  3.8  4.9  6.0
+
print(l$counts)
+
##  [1] 4 3 3 4 3 3 4 3 3 3
+
+
+

Beispiel 2

+
x = seq(-5, 6, by = 1 / 3)
+myhistogram(x, n = 5, min = -10, max = 10)
+
## $borders
+## [1] -10  -6  -2   2   6  10
+## 
+## $counts
+## [1]  0  9 12 12  1
+
solution = list(borders = c(-10, -6, -2, 2, 6, 10),
+                counts = c(0, 9, 12, 12, 1))
+
+
+

Beispiel 3

+

Ganze Zahlen mit Wiederholungen, Default-Werte für n, +min und max. Da \(b_{n+1}\) selbst zu keinem Intervall +gehört, wird das Maximum (10) als außerhalb gemeldet:

+
x = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10)
+l = myhistogram(x)
+print(l$borders)
+
##  [1]  1.0  1.9  2.8  3.7  4.6  5.5  6.4  7.3  8.2  9.1 10.0
+
print(l$counts)
+
##  [1] 1 2 3 4 1 1 1 1 1 1
+
+
+

Beispiel 4

+

Werte unterhalb von min und oberhalb von +max werden ignoriert und in der Warnung aufgelistet:

+
x = c(-3, -1, 0, 0.5, 1, 2.5, 4, 4.99, 5, 7)
+l = myhistogram(x, n = 5, min = 0, max = 5)
+
## Warning in myhistogram(x, n = 5, min = 0, max = 5): Zahl(en) außerhalb
+## Intervallgrenzen: -3, -1, 5, 7
+
solution = list(borders = c(0, 1, 2, 3, 4, 5),
+                counts = c(2, 1, 1, 0, 2))
+print(l$borders)
+
## [1] 0 1 2 3 4 5
+
print(l$counts)
+
## [1] 2 1 1 0 2
+
+
+

Beispiel 5

+

Normalverteilte Zufallszahlen, deren Bereich vollständig innerhalb +von min und max liegt (keine Warnung):

+
set.seed(42)
+x = rnorm(100, mean = 0, sd = 1)
+l = myhistogram(x, n = 8, min = -4, max = 4)
+print(l$borders)
+
## [1] -4 -3 -2 -1  0  1  2  3  4
+
print(l$counts)
+
## [1]  0  4 11 31 37 15  2  0
+
print(sum(l$counts))  # muss 100 ergeben
+
## [1] 100
+
+
+
+

Barplot

+

Nutzen Sie Ihre Funktion myhistogram und erzeugen Sie +einen Barplot mit ggplot. Die x-Achse zeigt dabei die +Mitte des Intervalls und die y-Achse die Anzahl der Elemente in +dieser Klasse.

+

Tipp: Der Parameter stat von geom_bar ist +wichtig.

+

Vervollständigen Sie den Chunk. Die Kommentare sollen zu Anweisungen +umgewandelt werden:

+
library("ggplot2")
+set.seed(1)
+x = rnorm(0, 1, n = 1000)
+h = myhistogram(x)
+bins = (h$borders[-1]+h$borders[-length(h$borders)])/2 # letzte und erste Grenze entfernen sodass nebeneinanderliegende Grenzen in den Vektoren jeweils auf der gleichen Indexposition liegen. Man verschiebt die Grenzen also 
+
+#print(h$borders[-1])
+#print(h$borders[length(-h$borders)])
+
+print(h$borders)
+
##  [1] -3.0080486 -2.3262161 -1.6443835 -0.9625510 -0.2807185  0.4011140
+##  [7]  1.0829466  1.7647791  2.4466116  3.1284442  3.8102767
+
count = h$counts #/sum(h$counts) # Damit kann man die relative statt der absoluten Häufigkeit anzeigen
+ggplot() + 
+ geom_bar(aes(x=bins, y=count), stat="identity")+
+  labs(title="Histogramm für normalverteilte Daten", y="Absolute Häufigkeit", x="Intervalle")
+

+
print(h$counts)
+
##  [1]  17  40 122 225 248 206  96  41   4   1
+
+
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/Testat_1/Aufgabe_1/EigenesHistogramm.pdf b/Testat_1/Aufgabe_1/EigenesHistogramm.pdf new file mode 100644 index 0000000..a58b99a Binary files /dev/null and b/Testat_1/Aufgabe_1/EigenesHistogramm.pdf differ diff --git a/Testat1_Plot2.pdf b/Testat_1/Aufgabe_2/Testat1_Plot2.pdf similarity index 100% rename from Testat1_Plot2.pdf rename to Testat_1/Aufgabe_2/Testat1_Plot2.pdf diff --git a/Aufgabe_3/Aufgabe 3 - krebsfälle_in_deutschland.Rmd b/Testat_1/Aufgabe_3/Aufgabe 3 - krebsfälle_in_deutschland.Rmd similarity index 100% rename from Aufgabe_3/Aufgabe 3 - krebsfälle_in_deutschland.Rmd rename to Testat_1/Aufgabe_3/Aufgabe 3 - krebsfälle_in_deutschland.Rmd diff --git a/Aufgabe_3/Aufgabe-3krebsfälle_in_deutschland.pdf b/Testat_1/Aufgabe_3/Aufgabe-3krebsfälle_in_deutschland.pdf similarity index 100% rename from Aufgabe_3/Aufgabe-3krebsfälle_in_deutschland.pdf rename to Testat_1/Aufgabe_3/Aufgabe-3krebsfälle_in_deutschland.pdf diff --git a/Aufgabe_3/Krebsdaten.csv b/Testat_1/Aufgabe_3/Krebsdaten.csv similarity index 100% rename from Aufgabe_3/Krebsdaten.csv rename to Testat_1/Aufgabe_3/Krebsdaten.csv diff --git a/Aufgabe_3/metadaten.txt b/Testat_1/Aufgabe_3/metadaten.txt similarity index 100% rename from Aufgabe_3/metadaten.txt rename to Testat_1/Aufgabe_3/metadaten.txt