R在for循环中填充数据框

时间:2014-12-23 00:29:05

标签: r dataframe

我有这个问题对我没用。

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而不是数据。

欢迎任何指导。

2 个答案:

答案 0 :(得分: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会产生有关下载文件长度的警告消息。我没有查看这些消息,但您可能想要。