16

Stata でプログラミングするとき、プログラミングでループ インデックスを使用していることに気付くことがよくあります。たとえば、変数の公称価格と実価格のリストをループします。

local list = "nominalprice realprice"
foreach i of local list {
  summarize `i'
  twoway (scatter `i' time)
  graph export "C:\TimePlot-`i'.png"
}

これは名目価格と実質価格の時系列をプロットし、TimePlot-nominalprice.png と呼ばれる 1 つのグラフと TimePlot-realprice.png と呼ばれる別のグラフをエクスポートします。

R では、同じことを行うために私が思いついた方法は次のようになります。

clist <- c("nominalprice", "realprice")
for (i in clist) {
  e <- paste("png(\"c:/TimePlot-",i,".png\")", sep="")
  eval(parse(text=e))
  plot(time, eval(parse(text=i)))
  dev.off() 
}

この R コードは直感的ではなく、乱雑に見えますが、R でこの種のことを行う良い方法はまだ見つかっていません。たぶん私は問題について正しい方法で考えていないだけですか?文字列を使用してループするより良い方法を提案できますか?

4

4 に答える 4

20

nominalprice他の人がほのめかしたように、 andという名前の列を持つデータフレームがあれば、これはより簡単になりますrealprice。そうでない場合は、いつでも使用できますget。ここではまったく必要ありませんparse

clist <- c("nominalprice", "realprice")
for (i in clist) {
   png(paste("c:/TimePlot-",i,".png"), sep="")
   plot(time, get(i))
   dev.off() 
}
于 2009-11-02T20:48:40.887 に答える
2

主な問題が「i」の代わりに eval(parse(text=i)) と入力する必要がある場合、文字列から式を評価するためのより使いやすい関数を作成できます。

e = function(expr) eval(parse(text=expr))

次に、R の例を次のように簡略化できます。

clist <- c("nominalprice", "realprice")
for (i in clist) {
  png(paste("c:/TimePlot-", i, ".png", sep=""))
  plot(time, e(i))
  dev.off() 
}
于 2009-11-02T20:37:48.287 に答える
1

eval() 関数を使用している理由がわからないことを除いて、元のソリューションの何が特に問題なのかわかりません。それは私には必要ないようです。

lapply などの適用関数を使用することもできます。これが実際の例です。ダミー データをzoo()時系列として作成しました (これは必須ではありませんが、時系列データを扱っているためです)。

# x <- some time series data
time <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1
x <- zoo(data.frame(nominalprice=rnorm(5),realprice=rnorm(5)), time)
lapply(c("nominalprice", "realprice"), function(c.name, x) { 
  png(paste("c:/TimePlot-", c.name, ".png", sep=""))
  plot(x[,c.name], main=c.name)
  dev.off()
}, x=x)
于 2009-11-02T20:31:15.563 に答える
1

ggplot2 と reshape を使用:

library(ggplot2)
library(reshape)
df <- data.frame(nominalprice=rexp(10), time=1:10)
df <- transform(df, realprice=nominalprice*runif(10,.9,1.1))
dfm <- melt(df, id.var=c("time"))
qplot(time, value, facets=~variable, data=dfm)
于 2009-11-02T20:48:10.793 に答える