diff --git a/.RData b/.RData new file mode 100644 index 0000000..edf1e33 Binary files /dev/null and b/.RData differ diff --git a/.Rhistory b/.Rhistory new file mode 100644 index 0000000..f7b19bd --- /dev/null +++ b/.Rhistory @@ -0,0 +1,423 @@ +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/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd b/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd index ffbb282..44ea79e 100644 --- a/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd +++ b/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd @@ -1,118 +1,160 @@ ---- -title: "Eigenes Histogramm" -output: html_document ---- - -# 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 = F} -# 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) -``` - - - -## 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 - -Testen Sie nun hier Ihre Funktion mit weiteren Datensätzen. - -### Beispiel 4 - -Testen Sie nun hier Ihre Funktion mit weiteren Datensätzen. - -### Beispiel 5 - -Testen Sie nun hier Ihre Funktion mit weiteren Datensätzen. - - -## 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} -set.seed(1) -x = rnorm(0, 1, n = 1000) -# h = myhistogram(x, n = 20) -# ggplot() + ... -``` +--- +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") + +``` diff --git a/Testat_1/Aufgabe_1/EigenesHistogramm.html b/Testat_1/Aufgabe_1/EigenesHistogramm.html index 4c8dd03..b4beeb6 100644 --- a/Testat_1/Aufgabe_1/EigenesHistogramm.html +++ b/Testat_1/Aufgabe_1/EigenesHistogramm.html @@ -1,507 +1,566 @@ - - - - - - - - - - - - - -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)){
-    
-  }
-  if (missing(max)){
-    
-  }
-  if (missing(n)){
-    n <- 10
-  }
-  intervals <- length(x)/n
-  print("Intervalle: ",intervals)
-  print(paste("Intervalel: ", intervals))
-  list(borders = c(), counts = c())
-}
-
-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
-
x = seq(-5, 6, by = 1 / 3)
-# 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)
-)
-
-
-

Beispiel 2

-
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

-

Testen Sie nun hier Ihre Funktion mit weiteren Datensätzen.

-
-
-

Beispiel 4

-

Testen Sie nun hier Ihre Funktion mit weiteren Datensätzen.

-
-
-

Beispiel 5

-

Testen Sie nun hier Ihre Funktion mit weiteren Datensätzen.

-
-
-
-

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)
+  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() + ...
+
+
+ + + + +
+ + + + + + + + + + + + + + +