Stataでプログラミングするとき、プログラミングでループインデックスを使用することがよくあります。たとえば、変数nominalpriceとrealpriceのリストをループします。
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でこの種のことを行うための良い方法をまだ見つけていません。多分私は問題について正しい方法を考えていないだけですか?文字列を使用してループするより良い方法を提案できますか?
他の人々が親しんでいるように、nominalprice
およびrealprice
という名前の列を持つデータフレームがある場合、これは簡単です。そうでない場合は、常にget
を使用できます。ここではparse
はまったく必要ありません。
clist <- c("nominalprice", "realprice")
for (i in clist) {
png(paste("c:/TimePlot-",i,".png"), sep="")
plot(time, get(i))
dev.off()
}
主な問題が「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()
}
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)
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)