【问题标题】:R loop with sprintf and paste使用 sprintf 和粘贴的 R 循环
【发布时间】:2016-07-07 08:43:45
【问题描述】:

我最近开始与 R 合作,展示公司和机构(世界银行、EIA、德勤和麦格理)对不同产品(美国天然气、日本 LNG 和 NBP 天然气)的价格预测。
因此,有一张图表显示世界银行关于美国天然气的价格预测,另一张图表显示世界银行关于日本液化天然气的价格预测,另一张图表显示世界银行关于 NBP 天然气的价格预测,依此类推,EIA、德勤和麦格理。 所以现在是 12 个图表。

我正在尝试编写一个带有循环的代码来自动创建和保存图形文件,但我很难让它工作。 不幸的是,我在 sprintfpaste 函数上苦苦挣扎,但我真的需要使用它们,但我想不出办法来解决剩余的错误消息。

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

您对我可以使其工作的方式有任何想法吗? 非常感谢您的帮助!

有了错误消息,我得到:

> library(ggplot2)
> library(scales)
> n <- 1
> c1 <- c("USA", "Japan", "NBP")
> c2 <- c("World Bank", "EIA", "Deloitte", "Macquarie")
> for (i in c1)
+ {
+ for (j in c2)
+ {
+ sprintf("chemin %d", n) <- "C:\\Travail\\Maxime\\Memoire\\Forecasts\\csv\\paste(i)realizedprice.csv"
+ sprintf("%srealizedprice", i) <- data.frame(read.table(sprintf("chemin%d", n), sep=";", dec=",", header=TRUE))
+ sprintf("%srealizedprice$Date", i) <- as.Date(sprintf("%srealizedprice$Date", i), format="%d/%m/%Y")
+ sprintf("%srealizedpricegraph", i) <- ggplot(data=sprintf("%srealizedprice", i), mapping=aes(x=Date, y=sprintf("%s.price", i))) + geom_line()
+ sprintf("%s%sforecast", i, j) <- sprintf("%sforecast", j)[sprintf("%sforecast", j)$Price.type == 'Natural Gas, sprintf("%s", i)',]
+ sprintf("%sgraph", i) <- ggplot(data=sprintf("%s%sforecast", i, j), aes(x=Price.date, y=Price, colour=as.character(paste(Price.type, Publication.date))))+geom_line()+geom_point()+geom_line(data = paste(i)realizedprice, aes(x = Date, y = paste(i).price), color = "cornflowerblue")+xlab('Date')+ylab('Price')+ggtitle("sprintf("World Bank forecast for Natural Gas %s", i)")
Erreur : unexpected symbol in:
" == 'Natural Gas, sprintf("%s", i)',]
sprintf("%sgraph", i) <- ggplot(data=sprintf("%s%sforecast", i, j), aes(x=Price.date, y=Price, colour=as.character(paste(Price.type, Publication.date))))+geom_line()+geom_point()+geom_line(dat"
> 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))
Error in sprintf("%sgraph", i) + scale_x_date(breaks = date_breaks("year"),  : 
  argument non numérique pour un opérateur binaire
> mypath <- file.path(sprintf("C:\\Travail\\Maxime\\Memoire\\Forecasts\\Graphs\\Boucle\\%d.png", n))
> paste(i)graph
Erreur : unexpected symbol in "paste(i)graph"
> png(file=mypath)
> plot(sprintf("%sgraph", i))
Error in plot.window(...) : valeurs finies requises pour 'ylim'
De plus : Warning messages:
1: In xy.coords(x, y, xlabel, ylabel, log) :
  NAs introduits lors de la conversion automatique
2: In min(x) : aucun argument trouvé pour min ; Inf est renvoyé
3: In max(x) : aucun argument pour max ; -Inf est renvoyé
> dev.off()
windows 
      2 
> n <- n + 1
> }
Erreur : '}' inattendu(e) in "}"
> }
Erreur : '}' inattendu(e) in "}"

【问题讨论】:

  • 我猜'Natural Gas 应该有一个结束引用。可能是sprintf("Natural Gas%s", i)。另一个问题是sprintf("chemin%d", n) &lt;- 不能在&lt;-lhs上,可能是assign(sprintf("chemin%d", n), "C:\\Travail\\Maxime\\Memoire\\Forecasts\\csv\\paste(i)realizedprice.csv")
  • 我试图写 == sprintf("Natural Gas%s", i),] 但我得到:错误:出现意外符号:“type == sprintf("Natural Gas%s", i),] sprintf("%sgraph", i)
  • 这就是我所说的,你不能在 lhs 上分配 &lt;-sprintf,即 sprintf("%s%sforecast", i, j) &lt;-
  • 好的,抱歉,我没有看到您留言的第二部分。谢谢,我会努力解决的。
  • 我用 assign(sprintf(something), something2) 替换了所有的 sprintf(someting)

标签: r loops for-loop printf paste


【解决方案1】:

我更改了一些行,但我只收到一条我不理解的最终错误消息。

    > 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=sprintf("%srealizedprice", i), mapping=aes(x=Date, y=sprintf("%s.price", i))) + 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=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
+ }
+ }

问题出在 ggplot 上:

> ggplot(data=sprintf("%srealizedprice", i), mapping=aes(x=Date, y=sprintf("%s.price", i))) + geom_line()
Erreur : ggplot2 doesn't know how to deal with data of class character

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多