Gleitender Mittelwert und NA

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Korab

Gleitender Mittelwert und NA

Beitrag von Korab »

Liebe Forengemeinde,

vor­ne­weg sei angemerkt, dass ich mit R auf Anfängerniveau arbeite. Trotzdem hoffe ich das Problem verständlich zu erläutern.
Der Quellcode:

Code: Alles auswählen

library("Cairo")
CairoSVG("Umfragen.svg",width=8.5,height=5.5)
daten3<-data.frame(zeit=c(25,1461),
"inst"=c("",""),
"ENDE"=c(50,50))
daten<-data.frame(zeit=c(25,35,37,43,45,49,50,58,59,64,66,70,71,72,72,73,76,78,78,99,105,109,111,120,128,130,135,141,150,159,160,165,169,175,183,189,194,199,201,209), 
"inst"=c("","I","I","T","I","M","i","E","I","M","I","T","C","i","T","I","I","M","I","I","K","I","I","T","I","M","i","E","I","M","I","T","C","i","T","I","I","M","I","I"), 
"PIS"=c(37.58,36,34.4,44,35,35,35,42,35,32,31.8,42,35,33,27,30,27.3,33,27.9,27.3,37.58,36,34.4,44,35,35,35,42,35,32,31.8,42,35,33,27,30,27.3,33,27.9,27.3), 
"PO"=c(24.09,19,19.9,17,20,22,18,16,15,19,18,17,15,17,16,15,14.4,14,12.7,16.2,24.09,19,19.9,17,20,22,18,16,15,19,18,17,15,17,16,15,14.4,14,12.7,16.2), 
"KUKIZ"=c(8.81,10,7.6,9,7,7,10,8,7,7,6.1,12,8,6,12,5,7.9,6,7.7,7,8.81,10,7.6,9,7,7,10,8,7,7,6.1,12,8,6,12,5,7.9,6,7.7,7),
"NOWO"=c(7.6,12,13.5,8,14,9,10,17,23,20,20,10,21,18,24,25,30.9,28,30.8,29.6,7.6,12,13.5,8,14,9,10,17,23,20,20,10,21,18,24,25,30.9,28,30.8,29.6), 
"ZL"=c(7.55,6,8.9,5,8,7,4,4,5,6,7.9,4,3,6,6,7,5.3,4,6.1,5.4,7.55,6,8.9,5,8,7,4,4,5,6,7.9,4,3,6,6,7,5.3,4,6.1,5.4), 
"PSL"=c(5.13,4,5,4,5,5,4,4,5,4,6.4,3,3,3,4,6,5.6,4,3.8,4.5,5.13,4,5,4,5,5,4,4,5,4,6.4,3,3,3,4,6,5.6,4,3.8,4.5),
"KORWIN"=c(4.79,4,3.8,3,4,5,6,4,5,4,3.7,2,3,6,NA,5,3.9,4,5,3.3,4.79,4,3.8,3,4,5,6,4,5,4,3.7,2,3,6,4,5,3.9,4,5,3.3),  
"RAZEM"=c(3.62,5,4.2,1,3,4,3,3,2,2,1.3,1,3,2,4,NA,1.6,1,1.9,2.2,3.62,5,4.2,1,3,4,3,3,2,2,1.3,1,3,2,4,2,1.6,1,1.9,2.2)) 

blau<-"#073A76" #PIS
orange<-"#FCA241" #PO
schwarz<-"#000000" #KUKIZ
tuerkis<-"#005CA9" #NOWO
rot<-"#E2001A" #ZL
gruen<-"#1bb100" #PSL
dunkelblau<-"#E8B909" #KORWIN
violett<-"#660033" #RAZEM 

cexwert=0.5


D<-dim(daten)[1]

plot(daten3$zeit,daten3$'ENDE',pch=as.character(daten3$inst), col="#000000",ylim=c(0,max(daten3$'ENDE')),
cex=cexwert, axes=FALSE,xlab="",ylab="")
for (i in 1:50)lines(c(0,3000),i*c(1,1),col="lightgrey",lwd=.3)
for (i in 1:10)lines(c(0,3000),i*c(5,5),col="lightgrey",lwd=.6)
lines(c(0,3000),rep(0,2),col="black",lty=1,lwd=2)
 
axis(2,at=c(0,5,10,20,30,40,50),labels=c("0%","5%","10%","20%","30%","40%","50%"), tick=FALSE, las=2)
 
verschieben=2
 
axis(1,at=seq(25,122,365.25/3),labels=paste(rep(c("Okt."),1),"\n",rep(2015:2015,each=1),sep=""),tick=FALSE)
axis(1,at=seq(153,2600,365.25/3),labels=paste(rep(c("Feb.","Jun.","Okt."),7),"\n",rep(2016:2019,each=3),sep=""),tick=FALSE)
points(daten$zeit,daten$PIS,pch=as.character(daten$inst),col=blau,cex=cexwert)
points(daten$zeit,daten$PO,pch=as.character(daten$inst),col=orange,cex=cexwert)
points(daten$zeit,daten$KUKIZ,pch=as.character(daten$inst),col=schwarz,cex=cexwert)
points(daten$zeit,daten$NOWO,pch=as.character(daten$inst),col=tuerkis,cex=cexwert)
points(daten$zeit,daten$ZL,pch=as.character(daten$inst),col=rot,cex=cexwert)
points(daten$zeit,daten$PSL,pch=as.character(daten$inst),col=gruen,cex=cexwert)
points(daten$zeit,daten$KORWIN,pch=as.character(daten$inst),col=dunkelblau,cex=cexwert)
points(daten$zeit,daten$RAZEM,pch=as.character(daten$inst),col=violett,cex=cexwert)


 
lines(c(0,3000),rep(5,2),col="darkgrey",lty=2,lwd=1.5)
title(main="Umfragen",font=2)
 
points(min(daten$zeit),daten$"PIS"[1],col="#073A76",pch=19,cex=1.25)
points(min(daten$zeit),daten$PO[1],col=orange,pch=19,cex=1.25)
points(min(daten$zeit),daten$KUKIZ[1],col=schwarz,pch=19,cex=1.25)
points(min(daten$zeit),daten$NOWO[1],col=tuerkis,pch=19,cex=1.25)
points(min(daten$zeit),daten$ZL[1],col=rot,pch=19,cex=0.75)
points(min(daten$zeit),daten$PSL[1],col=gruen,pch=19,cex=1.25)
points(min(daten$zeit),daten$KORWIN[1],col=dunkelblau,pch=19,cex=0.75)
points(min(daten$zeit),daten$RAZEM[1],col=violett,pch=19,cex=0.75)

daten<-daten[order(daten$zeit),]

movingaverage<-function(x,n) {

 l<-length(x)-n+1
 y<-x[1:l]
 for (i in 1:l)
   y[i]<-mean(x[(1:n)+i-1])
return(y) }

for (i in 3:10) {

 daten[7:D,i]<-movingaverage(daten[,i],7)
}

daten<-daten[-(1:6),]

lines(daten$zeit[-D],daten$PIS[-D],pch=as.character(daten$inst),col="#073A76",lwd=2) 
lines(daten$zeit[-D],daten$PO[-D],pch=as.character(daten$inst),col=orange,lwd=2) 
lines(daten$zeit[-D],daten$KUKIZ[-D],pch=as.character(daten$inst),col=schwarz,lwd=2) 
lines(daten$zeit[-D],daten$NOWO[-D],pch=as.character(daten$inst),col=tuerkis,lwd=2) 
lines(daten$zeit[-D],daten$ZL[-D],pch=as.character(daten$inst),col=rot,lwd=2)
lines(daten$zeit[-D],daten$PSL[-D],pch=as.character(daten$inst),col=gruen,lwd=2) 
lines(daten$zeit[-D],daten$KORWIN[-D],pch=as.character(daten$inst),col=dunkelblau,lwd=2) 
lines(daten$zeit[-D],daten$RAZEM[-D],pch=as.character(daten$inst),col=violett,lwd=2) 

dev.off()
Nun treten im Dataframe bei "RAZEM" und "KORWIN" fehlende Daten (NA) auf, sodass hinterher eine Lücke in der Graphik sichtbar wird.
Kurzum: Wie kann verhindert werden, dass die Mittelwertslinie nicht unterbricht?

Mit freundlichen Grüßen
Korab
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Gleitender Mittelwert und NA

Beitrag von jogo »

Hallo Korab,

willkommen im Forum!
Reicht Dir

Code: Alles auswählen

movingaverage<-function(x,n) {
  l <- length(x)-n+1
  y <- numeric(l)
  for (i in 1:l)   y[i]<-mean(x[(1:n)+i-1], na.rm=TRUE) 
  return(y) 
}
:?:
Ansonsten möchte ich noch auf die Funktion filter() hinweisen, mit der man gleitende Durchschnitte berechnen kann.

Gruß, Jörg
Korab

Re: Gleitender Mittelwert und NA

Beitrag von Korab »

Wow! Vielen Dank für die schnelle und hilfreiche Antwort :)
Antworten