R中字符串变量的循环

R中字符串变量的循环,r,statistics,stata,R,Statistics,Stata,在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-

在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的图形和另一个名为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() 
}

clist我看不出您的原始解决方案有什么特别的错误,只是我不知道您为什么要使用eval()函数。那对我来说似乎没有必要

您还可以使用apply函数,例如lappy。这里有一个有效的例子。我将虚拟数据创建为
zoo()
时间序列(这不是必需的,但因为您仍在处理时间序列数据):


#x如果您的主要问题是需要键入eval(parse(text=i))而不是“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() 
}

clist使用ggplot2和重塑:

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)
库(ggplot2)
图书馆(重塑)

df正如其他人所暗示的,如果您有一个名为
nominalprice
realprice
的列的数据框架,这将更容易实现。如果没有,则始终可以使用
get
。这里根本不需要
解析

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

clist谢谢乔纳森。我喜欢get(I)选项,我会尝试使用它。我使用的数据是虚拟数据,因此可以在数据帧中进行结构化。如果使用数据帧,会有什么不同?因为这样很容易通过字符串访问。假设您有一个数据帧
df
,其列名为
nominalprice
。然后您只需编写
df[,“nominalprice”]
即可获得该列。谢谢您的回答!这是一个非常有用的提示。它肯定会简化我的编码。我认为你应该使用Jonathan Chang所示的get()。在上面的函数中,c.name指的是什么?我试图理解如何将此技术应用于其他情况。c.name是一个变量名,我将其分配给lappy传递的get(在本例中,lappy只是传递该向量的每个元素,一次一个)。试着玩一下,看看它是如何工作的:lappy(c(1,2,3),function(x)print(x))。再看看?拉普利。
clist <- c("nominalprice", "realprice")
for (i in clist) {
   png(paste("c:/TimePlot-",i,".png"), sep="")
   plot(time, get(i))
   dev.off() 
}