Разделение фрейма данных на списки, содержащие константу в один столбец

#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. Отлично, спасибо! это также работает с моими исходными данными.