#r
#r
Вопрос:
У меня есть некоторые данные временных рядов, которые выглядят так:
Данные:
date FB AMZN GOOG MSFT
<date> <dbl> <dbl> <dbl> <dbl>
1 2016-01-04 102. 637. 742. 54.8
2 2016-01-05 103. 634. 743. 55.0
3 2016-01-06 103. 633. 744. 54.0
4 2016-01-07 97.9 608. 726. 52.2
5 2016-01-08 97.3 607. 714. 52.3
6 2016-01-11 97.5 618. 716. 52.3
Код:
data <- tidyquant::tq_get(c("FB", "AMZN", "GOOG", "MSFT"),
get = "stock.prices",
from = "2016-01-01",
to = "2017-01-01") %>%
dplyr::select(symbol, date, close) %>%
pivot_wider(names_from = symbol, values_from = close)
Я хочу сохранить один фиксированный столбец и сохранить в виде списка комбинаций zoo
объектов.
Я могу вручную сохранить результаты в виде zoo
объектов, используя:
time.points <- seq.Date(as.Date("2016-01-01"), by = 1, length.out = 252)
# For GOOG and MSFT
tsGOOG <- ts(data$GOOG)
tsMSFT <- ts(data$MSFT)
tsData1 <- zoo(cbind(tsGOOG, tsMSFT), time.points)
# For GOOG and AMZN
tsGOOG <- ts(data$GOOG)
tsAMZN <- ts(data$AMZN)
tsData2 <- zoo(cbind(tsGOOG, tsAMZN), time.points)
# For GOOG and FB
tsGOOG <- ts(data$GOOG)
tsFB <- ts(data$FB)
tsData3 <- zoo(cbind(tsGOOG, tsFB), time.points)
Я хотел бы сделать выше, но путем сопоставления столбцов, удерживая GOOG
столбец фиксированным (т. Е. GOOG
Столбец будет постоянным в каждом из списков, появляясь в каждом списке).
Редактировать:
Я пытался использовать pivot_longer
и затем group_split
. Как только группы будут разделены на список, я, возможно, смогу объединить фрейм GOOG
данных со всеми другими фреймами данных в списке.
Ответ №1:
1) Это дает список из 2 объектов xts / zoo столбцов с заданным символьным вектором tickers
символов тикера. get.close принимает тикер и возвращает объект xts / zoo из closes . f объединяет закрытия GOOG с закрытиями тикера, заданного в качестве его аргумента. Затем Map применяет его к тикерам, не являющимся GOOG.
library(quantmod)
tickers <- c("FB", "AMZN", "GOOG", "MSFT")
get.close <- function(sym) {
Cl(getSymbols(sym, from = "2016-01-01", to = "2017-01-01", auto = FALSE))
}
GOOG.cl <- get.close("GOOG")
f <- function(sym) cbind(GOOG.cl, get.close(sym))
L <- Map(f, setdiff(tickers, "GOOG"))
2) Чтобы получить этот вывод из data
(как определено в вопросе), используйте:
library(xts)
x <- as.xts(read.zoo(data))
L2 <- Map(function(sym) x[, c("GOOG", sym)], setdiff(tickers, "GOOG"))
Комментарии:
1. Спасибо! Это хорошо работает для финансовых данных, но мои фактические данные не являются финансовыми (они имеют точно такую же структуру, что и финансовые данные здесь), поэтому использование
get.close
функции не работает с моими данными. Однако полученный вами результат — это именно то, что я хочу.2. Добавили это.
3. Отлично, спасибо! это также работает с моими исходными данными.