Loop over string variables in R

后端 未结 4 1028
囚心锁ツ
囚心锁ツ 2021-01-31 20:51

When programming in Stata I often find myself using the loop index in the programming. For example, I\'ll loop over a list of the variables nominalprice and realprice:

相关标签:
4条回答
  • 2021-01-31 21:29

    As other people have intimated, this would be easier if you had a dataframe with columns named nominalprice and realprice. If you do not, you could always use get. You shouldn't need parse at all here.

    clist <- c("nominalprice", "realprice")
    for (i in clist) {
       png(paste("c:/TimePlot-",i,".png"), sep="")
       plot(time, get(i))
       dev.off() 
    }
    
    0 讨论(0)
  • 2021-01-31 21:40

    If your main issue is the need to type eval(parse(text=i)) instead of ``i'`, you could create a simpler-to-use functions for evaluating expressions from strings:

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

    Then the R example could be simplified to:

    clist <- c("nominalprice", "realprice")
    for (i in clist) {
      png(paste("c:/TimePlot-", i, ".png", sep=""))
      plot(time, e(i))
      dev.off() 
    }
    
    0 讨论(0)
  • 2021-01-31 21:41

    I don't see what's especially wrong with your original solution, except that I don't know why you're using the eval() function. That doesn't seem necessary to me.

    You can also use an apply function, such as lapply. Here's a working example. I created dummy data as a zoo() time series (this isn't necessary, but since you're working with time series data anyway):

    # 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)
    
    0 讨论(0)
  • 2021-01-31 21:50

    Using ggplot2 and 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)
    
    0 讨论(0)
提交回复
热议问题