2014-12-23 61 views
0

我有这个问题对我没有意义。R在for循环中填充数据帧

TickerList <- c("NAB.AX", "WES.AX", "TLS.AX", "CSL.AX", "WPL.AX", "SUN.AX") 
for (Ticker in TickerList) 
{ 
tickerdata.w <- get.hist.quote(Ticker, start = "2000-01-01",compression = "w", quote = "AdjClose") 

#This is to get Continuous Compounding Return 

ticker.log.data <- log(lag(tickerdata.w)) - log(tickerdata.w) 

#This should give the name of the ticker to the log data 
#eg, the first one will end up with a NAB.AX 

assign(Ticker, ticker.log.data) 

#Now I want to get the first data into a dataframe. 
#So I want MyData to hold the NAB.AX log data. 
#I know the loop works but there is something wrong with assigning the ticker data to the dataframe. 

    if (Ticker == TickerList[1]) { 
    MyData = (Ticker) 

#And now the rest are to be merged into the dataframe 

    } else { 
    MyData = merge(MyData, Ticker) 
    } 
} 

但是,它只是不起作用。唯一进入数据框的是名称,例如NAB.AX而不是数据。

任何指导将是最受欢迎的。

+0

您的示例不可重现。什么是get.hist.quote?它住在什么包里? –

+0

我不小心(可能是niavely)认为,当我将Ticker分配给data.frame时,Ticker将成为ticker.log.data。抛出一些打印后,我发现ticker.log.data在分配后仍然存在,我可以使用该data.frame在if循环中填充MyData。我希望这可以帮助未来的人。 – Stephen

+0

对不起,get.hist.quote在库(tseries)中。 – Stephen

回答

0
library(tseries) 

rm(list=ls()) 

TickerList <- c("NAB.AX", "WES.AX", "TLS.AX", "CSL.AX", "WPL.AX", "SUN.AX") 

for (Ticker in TickerList) 

{ 
tickerdata.w <- get.hist.quote(Ticker, start = "2000-01-01",compression = "w", quote = "AdjClose") 

ticker.log.data <- log(lag(tickerdata.w)) - log(tickerdata.w) 

assign(Ticker, ticker.log.data) 

    if (Ticker == TickerList[1]) { 

    Stock.DF <- (ticker.log.data) 

    } else { 

    Stock.DF <- merge(Stock.DF, ticker.log.data) 
    } 
} 
head(Stock.DF) 

names(Stock.DF) <- c("NAB", "WES", "TLS", "CSL", "WPL", "SUN") 

TSData = as.timeSeries(Stock.DF) 

Data = na.omit(TSData) 
+1

文体小窍门:使用< - 或=统一(< - 是首选) –

0

我假设你想要的是与股票代码为列名和行的日志数据的数据帧,但不是来自这个问题很清楚。

使用for循环构建数据框不是一种常见的R习惯用法,尽管它在其他语言中普遍存在。更好的方法是使用apply函数(它在引擎盖下使用for循环)。

首先,定义一个函数返回日志数据给定的股票代码。

getData <- function(symbol) { 
    tickerdata.w <- get.hist.quote(symbol, start = "2000-01-01", 
     compression = "w", quote = "AdjClose") 

    ticker.log.data <- log(lag(tickerdata.w)) - log(tickerdata.w) 
    ticker.log.data <- ticker.log.data[1:778,] # ensure equal length 
    return(ticker.log.data) 
} 

注意绝大部分您所提供的符号给长度778的结果,但如果你想有一个数据帧中的一个给长度780,都必须具有相同的长度,所以在getData截断注释行。

接下来,将该函数应用于每个符号。这会生成一个列表。用它们的符号重命名列表中的元素。

TickerList <- c("NAB.AX", "WES.AX", "TLS.AX", "CSL.AX", "WPL.AX", "SUN.AX") 
MyData <- lapply(TickerList, FUN = getData) 
names(MyData) <- TickerList 

最后,从列表转换为数据框。

MyData <- data.frame(MyData) 

请注意,您的来电get.hist.quote在对下载的文件长度的警告消息,这些符号的结果。我没有看到这些消息,但你可能想。

+0

我注意到WES有一个问题,因为数据自资本回报以来没有发布到雅虎财经。感谢您指出。感谢您的回复。 – Stephen