我正在尝试在同一页面上绘制多个图表。当我像这样逐个编写代码时,它工作正常:
old.par <- par(mfrow = c(3,4))
plot(na.omit(AUS.Yield), xlab = "Date", ylab = "log_return", main = "AUS.Yield")
plot(na.omit(BRA.Yield), xlab = "Date", ylab = "log_return", main = "BRA.Yield")
plot(na.omit(CAN.Yield), xlab = "Date", ylab = "log_return", main = "CAN.Yield")
plot(na.omit(CHI.Yield), xlab = "Date", ylab = "log_return", main = "CHI.Yield")
plot(na.omit(GER.Yield), xlab = "Date", ylab = "log_return", main = "GER.Yield")
plot(na.omit(JAP.Yield), xlab = "Date", ylab = "log_return", main = "JAP.Yield")
plot(na.omit(SOA.Yield), xlab = "Date", ylab = "log_return", main = "SOA.Yield")
plot(na.omit(SWI.Yield), xlab = "Date", ylab = "log_return", main = "SWI.Yield")
plot(na.omit(UK.Yield), xlab = "Date", ylab = "log_return", main = "UK.Yield")
plot(na.omit(US.Yield), xlab = "Date", ylab = "log_return", main = "US.Yield")
但是当我尝试使用for
循环时,它不起作用,例如:
## names(log_return[2:11]) will give me all those AUS.Yield, BRA.Yield etc as they are the column names of dataframe log_return
for (i in names(log_return[2:11]){
plot(na.omit(i), xlab = "Date", ylab = "log_return", main = "i")
}
另外,我使用:
生成了10个时间序列for (i in 2:length(log_return)){
assign(names(log_return[i]),xts(log_return[i],log_return$Date))
}
所以我得到了10个时间序列,名称为:AUS.Yield,BRA.Yield ....等。
只是想知道哪里出错了...... 以下是错误消息:
Error in plot.window(...) : need finite 'ylim' values
我想也许我的数据框中有这么多的NA?但我已经使用了na.omit
。
这是datafram log_retrun;
的一小部分 Date AUS.Yield BRA.Yield CAN.Yield CHI.Yield GER.Yield JAP.Yield
1 2008-01-01 NA NA NA NA NA NA
2 2008-01-02 NA NA NA NA NA NA
3 2008-01-03 -0.033047602 -0.01239795 0.003828977 -0.017857617 -0.031966192 NA
4 2008-01-04 -0.003922215 0.00198792 -0.008443187 0.006734032 -0.006984895 NA
5 2008-01-05 NA NA NA NA NA NA
6 2008-01-06 NA NA NA NA NA NA
JAP.Yield可能会查看所有NA,但是在几行之后会有值。
提前感谢您的任何帮助和建议!! T_T
答案 0 :(得分:1)
您不需要持久创建xts
个对象。请注意在names()
规范中修改for()
函数的使用:
for (i in names(log_return)[2:11]){
plot(na.omit(xts(log_return[[i]],log_return$Date)), xlab = "Date", ylab = "log_return", main = i)
}
或者,正如@SpacedMan所提到的那样,如果你确实想要内存中的get()
个对象,你可以使用xts
来按名称引用变量:
for (i in names(log_return)[2:11]){
plot(na.omit(get(i)), xlab = "Date", ylab = "log_return", main = i)
}
答案 1 :(得分:0)
事物的名称与事物本身不同。
字符串“foo”和对象foo
是不同的东西。如果你plot("foo")
它试图绘制字符串“foo”。如果您plot(foo)
,则绘制名为foo
的对象。
那么,你在做什么:
for (i in names(log_return[2:11]){
plot(na.omit(i), xlab = "Date", ylab = "log_return", main = "i")
}
names(something)
将名称作为字符串返回。所以你正在做plot("AUS.yield")
,它正在绘制字符串,而不是事物。
解决方案:最好不要使用assign
创建名称。而是创建一个包含命名对象的列表。然后,您可以执行name="AUS.yield";data[[name]]
之类的操作,以便从字符串中的名称中获取数据。
最糟糕的解决方案是使用get(name)
,它试图获取具有给定名称的东西(在你的情况下,类似plot(get(i))
的东西应该这样做。这是“最差”的解决方案,因为它是一个小提琴撤消你原来犯的错误,当你应该在列表中构建它们时,按名称创建大量对象。