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 @@ - - - - -
- - - - - - - - -Es soll ein eigenes Histogramm erzeugt werden. Der Dateiname für das
-Skript ist myhistogram.R.
myhistogramProgrammieren 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.
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.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
-Hier zunächst zwei Beispiele.
-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
-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))
-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
-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
-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
-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() + ...
-Es soll ein eigenes Histogramm erzeugt werden. Der Dateiname für das
+Skript ist myhistogram.R.
myhistogramProgrammieren 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.
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.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
+Hier zunächst zwei Beispiele.
+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
+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))
+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
+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
+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
+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
+