Seite 1 von 1

0, Leerstellen in Matrix/Tabelle einfügen

Verfasst: Sa Mär 20, 2021 5:26 pm
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

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

Verfasst: So Mär 21, 2021 9:16 am
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).

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

Verfasst: So Mär 21, 2021 4:03 pm
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

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

Verfasst: So Mär 21, 2021 5:55 pm
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...

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

Verfasst: Mo Mär 22, 2021 12:29 pm
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

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

Verfasst: Di Mär 23, 2021 11:52 am
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")