diff --git a/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd b/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd new file mode 100644 index 0000000..ffbb282 --- /dev/null +++ b/Testat_1/Aufgabe_1/EigenesHistogramm.Rmd @@ -0,0 +1,118 @@ +--- +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() + ... +``` diff --git a/Testat_1/Aufgabe_1/EigenesHistogramm.html b/Testat_1/Aufgabe_1/EigenesHistogramm.html new file mode 100644 index 0000000..4c8dd03 --- /dev/null +++ b/Testat_1/Aufgabe_1/EigenesHistogramm.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + +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() + ...
+
+
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/Testat_1/Aufgabe_1/myhistogram.R b/Testat_1/Aufgabe_1/myhistogram.R new file mode 100644 index 0000000..decebe4 --- /dev/null +++ b/Testat_1/Aufgabe_1/myhistogram.R @@ -0,0 +1,15 @@ +myhistogram = function(x, min, max) { + if (missing(min)){ + + } + if (missing(max)){ + + } + + list(borders=c(), counts=c()) +} + +x = seq(-5, 6, by = 1 / 3) +l = myhistogram(x) +print(l$borders) +print(l$counts) diff --git a/Testat_1/Testat1.pdf b/Testat_1/Testat1.pdf new file mode 100644 index 0000000..97eb50e Binary files /dev/null and b/Testat_1/Testat1.pdf differ