Как преобразовать список списков в фрейм данных в R - PullRequest
1 голос
/ 21 сентября 2019

Я использую quantmod для загрузки цепочек опций, которые представляются в виде вложенных списков.

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

Как это может бытьвыполнено в R?

Для воспроизводимого примера:

library(quantmod)
AAPL.2015 <- getOptionChain("AAPL", "2019/2021")

enter image description here

И, если возможно, что я должен сделать, чтобы получитьдаты выбора опционов на английском языке?

Ответы [ 3 ]

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

Рассмотрим от Map до rbind отдельных вызовов и помещает кадры данных, добавляя необходимые столбцы индикатора.Поскольку отдельные кадры данных находятся во вложенном именованном списке, используется функция извлечения [.

Затем выполните итоговый do.call + rbind в результирующем списке кадров данных.ПРИМЕЧАНИЕ: rbind предполагает, что фреймы данных вызова и ввода поддерживают одинаковые имена и количество столбцов.

call_put_func <- function(nm, call_df, put_df) {      
     cbind(rbind(transform(call_df, option_type = "call"),
                 transform(put_df, option_type = "put")
           ), date_of_strike = nm)
}

APPL_flat_df_list <- Map(call_put_func, nm = names(AAPL.2015), 
                                        call_df = lapply(AAPL.2015, "[[", "calls"), 
                                        put_df = lapply(AAPL.2015, "[[", "puts")
                        )

APPL_df <- do.call(rbind, unname(APPL_flat_df_list))
1 голос
/ 22 сентября 2019

Может быть более гибко работать с парой функций из dplyr и purrr.dplyr::bind_rows может принимать список фреймов данных, и они могут иметь разные имена, тогда как база rbind работает только с 2 фреймами данных одновременно.bind_rows также имеет аргумент .id, который создаст столбец с именами элементов списка.purrr::map_dfr вызывает функцию над списком и возвращает фрейм данных, все из которых связаны строкой;поскольку он охватывает bind_rows, он также имеет аргумент .id.

Доступ к настройке этих идентификаторов полезен, поскольку у вас есть 2 набора идентификаторов: один из дат и один из вызовов против пут.Установка одного идентификатора во внутреннем bind_rows и одного в map_dfr приводит к обоим.

Записано с помощью функции, чтобы ее было немного легче увидеть:

library(quantmod)
AAPL.2015 <- getOptionChain("AAPL", "2019/2021")

aapl_df <- purrr::map_dfr(AAPL.2015, function(d) {
  dplyr::bind_rows(d, .id = "type")
  }, .id = "date")

head(aapl_df)
#>          date  type Strike  Last   Chg   Bid   Ask Vol OI
#> 1 Sep.27.2019 calls    140 79.50  9.50 77.60 77.90  10 30
#> 2 Sep.27.2019 calls    145 75.85  0.00 72.70 73.30  NA 28
#> 3 Sep.27.2019 calls    150 72.22  0.00 67.85 67.90  10 91
#> 4 Sep.27.2019 calls    155 52.53  0.00 65.80 69.90  NA 10
#> 5 Sep.27.2019 calls    160 60.10  0.00 57.85 58.15   2 11
#> 6 Sep.27.2019 calls    165 54.40 15.95 52.65 52.90   9 16

Или вболее распространенный dplyr трубопровод с сокращенной записью функции:

library(dplyr)
aapl_df <- AAPL.2015 %>%
  purrr::map_dfr(~bind_rows(., .id = "type"), .id = "date")
1 голос
/ 21 сентября 2019

Я не смог воспроизвести ваш пример, но то, что вы пытаетесь сделать, просто.Вы можете использовать do.call для вызова функции rbind в списке, и в конце вы получите симпатичный фрейм данных.

list <- getOptionChain("AAPL", "2019/2021")

data <- do.call(rbind, list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...