2014-12-23 4 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) 
    } 
} 

Однако, это просто не работает. Единственное, что входит в dataframe, это имя, такое как NAB.AX, а не данные.

Любое руководство было бы очень желанным.

+0

Ваш пример не воспроизводится. Что такое get.hist.quote? В каком пакете он живет? –

+0

Я непреднамеренно (возможно, niavely) думал, что когда я назначил Ticker в data.frame, тикер станет тикером.log.data. После броска в некоторые отпечатки я обнаружил, что ticker.log.data все еще существует после назначения, и я смог использовать этот data.frame для заполнения MyData в цикле if. Надеюсь, это поможет кому-то в будущем. – 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 была проблема, поскольку данные не были опубликованы в Yahoo Finance с момента возврата капитала. Спасибо, что указали это. Спасибо за ваш ответ. – Stephen

Смежные вопросы