Как зациклить функцию и сгенерировать 3 отдельных списка в R - PullRequest
1 голос
/ 22 сентября 2019

Я бы хотел загружать ежедневные цены в течение трех месяцев с помощью функции BatchGetSymbols.Моя цель - автоматизировать этот процесс, чтобы мне не приходилось менять код всякий раз, когда я решаю использовать другой период времени (например, количество месяцев).Функция BatchGetSymbols возвращает список.

Цикл for выглядит следующим образом:

holdingperiod <- seq(last.date, last.date %m+% months(3), by = "months")
names <- cbind(c("w.one","w.two","w.three"))

for(i in 1 : length(names)){
  names[i] <- BatchGetSymbols(tickers = winnertickers$`S&P500 Ticker`, first.date = holdingperiod[i], last.date = holdingperiod[i+1], do.cache = FALSE, freq.data = "daily")
}

Всякий раз, когда я запускаю этот код, он выдает мне сообщение об ошибке:

Warning messages:
1: In names[i] <- BatchGetSymbols(tickers = winnertickers$`S&P500 Ticker`,  :
  number of items to replace is not a multiple of replacement length
2: In names[i] <- BatchGetSymbols(tickers = winnertickers$`S&P500 Ticker`,  :
  number of items to replace is not a multiple of replacement length
3: In names[i] <- BatchGetSymbols(tickers = winnertickers$`S&P500 Ticker`,  :
  number of items to replace is not a multiple of replacement length

То, что я хочу сделать для цикла for, - это создать эквивалентный результат для следующих строк кода:

w.one <- BatchGetSymbols(tickers = winnertickers$`S&P500 Ticker`, first.date = holdingperiod[1], last.date = holdingperiod[2], do.cache = FALSE, freq.data = "daily")
w.two <- BatchGetSymbols(tickers = winnertickers$`S&P500 Ticker`, first.date = holdingperiod[2], last.date = holdingperiod[3], do.cache = FALSE, freq.data = "daily")
w.three <- BatchGetSymbols(tickers = winnertickers$`S&P500 Ticker`, first.date = holdingperiod[3], last.date = holdingperiod[4], do.cache = FALSE, freq.data = "daily")

Это означает, что я хотел бы получить 3 списка с именами w.one, w.two иw.three.У кого-нибудь есть идея, как я могу сделать это / что написать вместо имен [i]?Пожалуйста, дайте мне знать, если требуется дополнительная информация.Я ценю любую помощь.С наилучшими пожеланиями:)

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Для этого вы можете использовать функцию assign:

for(i in 1 : length(names)){
    assign(names[i], BatchGetSymbols(tickers = "FB", first.date = holdingperiod[i], last.date = holdingperiod[i+1], do.cache = FALSE, freq.data = "daily"))
}

Но, возможно, было бы более полезно иметь список (например, w), содержащий три загруженных набора данных:

w <- lapply(
    1:3, 
    function(i) {
        BatchGetSymbols(tickers = "FB", first.date = holdingperiod[i], last.date = holdingperiod[i+1], do.cache = FALSE, freq.data = "daily)
    }
)

Это позволяет lapply / purrr более w.

0 голосов
/ 22 сентября 2019

Первая мысль, которая у меня возникла: вы действительно хотите включить cbind в

names <- cbind(c("w.one","w.two","w.three"))

, поскольку его ходы names превращаются в матрицу 3x1, поэтому, если BatchGetSymbols генерирует векторы / спискиразной длины у вас есть проблема, потому что они не «вписываются» в матрицу?

Предположим, вы удалили cbind, так что names это просто вектор нужных вам имен, то есть

names <- c("w.one","w.two","w.three")

Затем вы можете использовать assign внутри цикла for для определения новых переменных, используя любые имена переменных, которые вы определили в векторе names:

for(i in 1:length(names)){
    assign(names[i], BatchGetSymbols( … ))
}

Если вы наберете ls() теперь вы видите w.one, w.two и w.three, определенные в вашем рабочем пространстве ...

Я предполагаю, BatchGetSymbols( … ) генерирует списки?Если так, то эти три новые переменные также будут определены как списки, но если векторы, то вы можете использовать as.list(BatchGetSymbols(…)) внутри цикла for, если вы действительно хотите, чтобы они были списками.

Надеюсь, это поможетбит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...