문제

STATA에서 프로그래밍 할 때는 종종 프로그래밍에서 루프 색인을 사용합니다. 예를 들어, 명목 가격과 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 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() 
}

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)

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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top