0, Leerstellen in Matrix/Tabelle einfügen

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

0, Leerstellen in Matrix/Tabelle einfügen

Beitrag von JPWJS »

Hallo,
ich erstelle mir eine Tabelle in der die jährlichen Verhältnisse von gestuften Messwerten eingetragen sind. Die Messwerte sind in 5 Stufen von 0 bis 4 unterteilt.
Folgender Code erstellt mir die Tabelle aus einer Ursprungstabelle

Code: Alles auswählen

Eingabe<-file.choose()
Quercus<-read.csv(Eingabe, header = TRUE, sep = ";")

daten<-subset(Quercus, select=c())
z<-c(0,1,2,3,4)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2020"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2020"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2019"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2019"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2018"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2018"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2017"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2017"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2016"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2016"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2015"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2015"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2014"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2014"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2013"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2013"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2012"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2012"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2011"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2011"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2010"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2010"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2009"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2009"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2008"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2008"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2007"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2007"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2006"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2006"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2005"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2005"])
z<-rbind(z,y)
y<-100*table(as.matrix(Quercus$Vitalitaet[Quercus$Jahr=="2004"]))/length(Quercus$Vitalitaet[Quercus$Jahr=="2004"])
z<-rbind(z,y)
z<-z[2:18, 1:5]
Wobei z<-c(...) dafür sorgt, dass alle Stufen in der Tabelle eingetragen werden und z<-z[...] die erste Zeile wieder eintfernt.
Mein Problem ist jetzt folgendes:

Sind nicht alle Stufen in der Ursprungstabelle enthalten, wird das Verhältnis des ersten vorkommenden Messwertes unter '0' gespeichert. Kommen nur zwei Stufen vor werden diese unter den ersten beiden Stufen der Tabelle, '0' und '1' gespeichert und bis zur letzten im wechsel eingetragen. Dies verfälscht am Ende mein Ergebnis.

Wie kann ich in meinem Code ergänzen, dass wenn im Urprung keine Stufe '0' dabei ist, das Verhältniss unter '0' ebenfallls gleich 0 ist?

Vielen Dank vorab
Jens
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: 0, Leerstellen in Matrix/Tabelle einfügen

Beitrag von EDi »

Wieso das as.matrix?

Wenn du Quercus$Vitalitaet ordentlich als faktor mit allen vorhandenen Stufen definierst, hast du alle levels immer dabei

Code: Alles auswählen

y <- c(0, 0, 1, 3, 4, 4)
table(factor(y, levels = 0:5))
Auch sieht es so als ob man die ganze Code-duplizierung reduzieren kann indem man das pro Jahr rechnet/iteriert (weniger code = weniger fehler).
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

Re: 0, Leerstellen in Matrix/Tabelle einfügen

Beitrag von JPWJS »

Ich hatte das aus dem Buch "Datendesign mit R" übernommen. Hat ein scgönes Balkendiagramm ergeben, mit dem Problem, dass durch o.g. Problemteilweise mehr da war als da sein sollte, über 100%. Und das wäre dann auch meine nächste Frage.
Wie bekomme ich jetzt aus den absoluten Anzahlen der Faktoren, prozentuale Verhältnisse? Über die vorherige Variante mit 100* table(...)/length() funktioniert es nicht mehr
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: 0, Leerstellen in Matrix/Tabelle einfügen

Beitrag von EDi »

Bitte ein reproduzierbares Beispiel posten.

https://stackoverflow.com/questions/596 ... le-example

Diese Zeile finde ich auch etwas komisch:

Code: Alles auswählen

subset(Quercus, select=c())
das subset macht doch nichts...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

Re: 0, Leerstellen in Matrix/Tabelle einfügen

Beitrag von JPWJS »

Code: Alles auswählen

#Tabelle erstellen
BaumID<-c(1,1,1,2,2,3,3,3,4,4,4)
Vitalitaet<-c(1,1,2,0,1,2,3,4,1,1,2)
Jahr<-c(2004,2005,2006,2005,2006,2004,2005,2006,2004,2005,2006)
Tabelle<-cbind(BaumID, Vitalitaet, Jahr)

#Tabelle mit den Häufigkeiten der Vitalitaetswerte erstellen, auch über for-Schleife denkbar
z<-NULL
q<-table(factor(Vitalitaet[Jahr=="2004"], level=0:4))
z<-cbind(z,q)
q<-table(factor(Vitalitaet[Jahr=="2005"], level=0:4))
z<-cbind(z,q)
q<-table(factor(Vitalitaet[Jahr=="2006"], level=0:4))
z<-cbind(z,q)

#Visualisierung als Barplot()
vit<-c("0", "1", "2", "3","4")

f1<-rgb(0,255,0,maxColorValue = 255)
f2<-rgb(166,255,64,maxColorValue = 255)
f3<-rgb(255,223,42,maxColorValue = 255)
f4<-rgb(255,0,0,maxColorValue = 255)
f5<-rgb(0,0,0,maxColorValue = 255)
farben<-c(f1,f2,f3,f4,f5)
namen<-c(2020,2005,2004)
daten<-cbind(z[1,],z[2,],z[3,],z[4,],z[5,])
daten1<-t(daten)
barplot(z, names.arg=namen,   cex.names = 1.1, horiz=T, border = NA,
           col = farben, axes = T, las=1)


Die einzelnen Balken sind jetzt unterschiedlich lang durch unterschiedliche Häufigkeiten an Bäumen in dem entsprechenden Jahr. Eine Darstellung über die Verhältnisse wäre schöner, wie das in meinem ursprünglichen Code (aus dem Buch übernommen) passiert. Auf diese Art wie es dort funktioniert klappt es in dieser Berechnung der Häufigkeitstabelle leider nicht
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: 0, Leerstellen in Matrix/Tabelle einfügen

Beitrag von EDi »

So würde ich das machen:

Code: Alles auswählen

BaumID<-c(1,1,1,2,2,3,3,3,4,4,4)
Vitalitaet<-c(1,1,2,0,1,2,3,4,1,1,2)
Jahr<-c(2004,2005,2006,2005,2006,2004,2005,2006,2004,2005,2006)
Tabelle<-data.frame(BaumID, Vitalitaet, Jahr)

library(dplyr)
library(ggplot2)

agg <- Tabelle %>%
  group_by(Jahr, Vitalitaet) %>%
  summarise(n = n()) %>%
  mutate(freq = n / sum(n))
  
 ggplot(agg, aes(x = Jahr, y = freq, fill  = factor(Vitalitaet))) +
 geom_bar(stat = "identity")

Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten