2016-07-07 3 views
0

Ich habe vor kurzem begonnen, mit R zu arbeiten, um Preisprognosen von Firmen und Institutionen (Weltbank, EIA, Deloitte und Macquarie) für verschiedene Produkte anzuzeigen (USA Erdgas , Japan LNG und NBP Gas). Es gibt also eine Grafik, die die Preisvorgabe für die Weltbank über USA Natural Gas, eine weitere Grafik für die Weltbank über Japan LNG, eine weitere für die Weltbank über das NBP Gas usw. mit der EIA, Deloitte und Macquarie anzeigt. Es sind also 12 Grafiken für jetzt. Ich hatte einige Probleme mit paste und sprintf() Funktionen, aber ich habe es gelöst.Fehler: ggplot2 kann nicht mit Daten des Klassencharakters umgehen

Jetzt habe ich ein großes letztes Problem, beacause, wenn ich den Code ausführen, erhalte ich:

Error : ggplot2 doesn't know how to deal with data of class character 

Und ich weiß wirklich nicht, wie sie damit umgehen. Haben Sie eine Idee, was ist falsch daran? Danke! Hier

ist der Code:

chemin <- choose.files() 
forecast <- data.frame(read.table(chemin, sep=";", dec=",", header=TRUE)) 
forecast$Publication.date <- as.Date(forecast$Publication.date, format="%d/%m/%Y") 
forecast$Price.date <- as.Date(forecast$Price.date, format="%d/%m/%Y") 
EIAforecast <- forecast[forecast$Forecaster=="EIA",] 
WorldBankforecast <- forecast[forecast$Forecaster=="World Bank",] 
Macquarieforecast <- forecast[forecast$Forecaster=="Macquarie",] 
Deloitteforecast <- forecast[forecast$Forecaster=="Deloitte",] 

library(ggplot2) 
library(scales) 
n <- 1 
c1 <- c("USA", "Japan", "NBP") 
c2 <- c("WorldBank", "EIA", "Deloitte", "Macquarie") 
for (i in c1) 
{ 
for (j in c2) 
{ 
assign(sprintf("%srealizedprice", i), data.frame(read.table(paste("C:\\Travail\\Maxime\\Memoire\\Forecasts\\csv", paste0(i, "realizedprice.csv"), sep="\\"), sep=";", dec=",", header=TRUE))) 
assign(sprintf("%srealizedprice$Date", i), as.Date(sprintf("%srealizedprice$Date", i), format="%d/%m/%Y")) 
assign(sprintf("%srealizedpricegraph", i), ggplot(data=paste0(i, "realizedprice"), mapping=aes(x=Date, y=paste(i, "price", sep="."))) + geom_line()) 
assign(sprintf("%s%sforecast", i, j), paste(paste(paste0(j, "forecast"), paste0(j, "forecast$Price.type == "), sep="["), paste("\"Natural Gas", paste0(i, "\"]"), sep=", "), sep="")) 
assign(sprintf("%sgraph", i), ggplot(data=get(paste0(i, j, "forecast")), aes(x=Price.date, y=Price, colour=as.character(paste(Price.type, Publication.date))))+geom_line()+geom_point()+geom_line(data = paste0(i, "realizedprice"), aes(x = Date, y = paste(i, "price", sep=".")), color = "cornflowerblue")+xlab('Date')+ylab('Price')+ggtitle(sprintf("World Bank forecast for Natural Gas %s", i))) 
assign(sprintf("%sgraph", i), sprintf("%sgraph", i) + scale_x_date(breaks = date_breaks("year"),labels = date_format("%Y"))+scale_y_continuous(breaks = seq(0, 25, 1))) 
mypath <- file.path(sprintf("C:\\Travail\\Maxime\\Memoire\\Forecasts\\Graphs\\Boucle\\%d.png", n)) 
paste0(i, "graph") 
png(file=mypath) 
plot(sprintf("%sgraph", i)) 
dev.off() 
n <- n + 1 
} 
} 
+0

Ich werde nicht versuchen, diesen Code zu lesen, aber basierend auf der Fehlermeldung versuchen Sie, Ihre Zeichenvariable in einen Faktor mit 'factor' oder' as.factor' zu konvertieren und sehen, ob es funktioniert. – lmo

+2

Grundsätzlich kommen alle Ihre Probleme von dem Versuch, Ihre Probleme mit 'assign' und' get' zu lösen. Wenn du gerade erst anfängst, musst du neu beginnen und buchstäblich vergessen, dass du jemals von diesen Funktionen gehört hast. Sie werden nur dazu führen, dass Sie sich in eine Ecke einordnen. Verbringe etwas Zeit mit _named lists_. Benannte Listen Benannte Listen – joran

+0

Was ist mit all den 'assign's? Das sieht nicht nach einem R-ähnlichen Code aus. Plus in der Endnutzung scheint nur 'plot()' zu verwenden, was keine 'ggplot'-Plotfunktion ist. Sie können die Zeichenfolgen für Variablen in R nicht vertauschen. – MrFlick

Antwort

1

Ich hatte dieses Problem bei dem Versuch, Breite plotten/Länge auf einer Karte. Die Nachricht war etwas mehrdeutig für meinen Geschmack. Was das Problem war, war, dass ich die Koordinaten aus einem anderen Datensatz mit c (lat, lon) extrahiert hatte und so eine Liste erstellt hatte, als ich cbind (lat, lon) hätte verwenden sollen, um eine Matrix zu erstellen, die ich dann in einen Datenrahmen verwandelte as.data.frame.

Verwandte Themen