【发布时间】:2016-07-07 14:02:53
【问题描述】:
我最近开始与 R 合作,展示公司和机构(世界银行、EIA、德勤和麦格理)对不同产品(美国天然气、日本液化天然气和 NBP 天然气)的价格预测。
因此,有一张图表显示世界银行关于美国天然气的价格预测,另一张图表显示世界银行关于日本液化天然气的价格预测,另一张图表显示世界银行关于 NBP 天然气的价格预测,依此类推,EIA、德勤和麦格理。所以现在是 12 个图表。
我在使用 paste 和 sprintf() 函数时遇到了一些问题,但我设法解决了。
现在我有一个大问题,因为当我运行代码时,我得到:
Error : ggplot2 doesn't know how to deal with data of class character
而且我真的不知道如何处理它。 你知道它有什么问题吗? 谢谢!
代码如下:
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
}
}
【问题讨论】:
-
基本上,您所有的问题都来自尝试使用
assign和get解决问题。如果您刚刚开始,您需要重新开始,并且完全忘记您曾经听说过这些功能。他们所做的只是让你把自己编码到一个角落里。花一些时间在命名列表上。命名列表。命名列表。 -
我认为这里的问题是 ggplot(data=get(paste0(i, j, "forecast")),但我最近开始使用 R,所以“字符变量”是指我和 j (循环变量)还是整个 paste0(i, j, "forecast") ?谢谢!
-
@user37103 是的,基本上。但是您需要备份并废弃使用
paste和sprintf构建变量名称并使用assign分配给它们的整个概念。命名列表! -
我告诉你使用
<-而不是assign。但这一切只有在您了解 R 的基本数据结构时才有效。其中......_命名列表_。 :) 我真的很想提供更多帮助,但是如果没有可重复的示例,给您更具体的指导是非常具有挑战性的。 -
我觉得@joran 的评论需要强调一下……我的建议也是首先学习 R 的基础知识,比如基本数据结构以及原理。像
sprintf(x) <- y这样的东西不会起作用,因为一旦你对 R 有了更多的了解,原因就会变得很明显。当你切换到命名列表时,这些问题就不存在了,但你首先必须从 (或字符向量,以及因素)。