如何将yfR获取的多标的金融数据转换为指定多列DataFrame?
解决yfR下载数据的多列重组需求
问题背景
使用yfR包从Yahoo Finance下载了多个指数(如GSPC、FTSE)的日度数据,因不同标的节假日差异导致观测行数不同。需要将每个标的的日期(Date)和调整后价格(Price)拆分为独立列,最终得到类似Date_^FTSE、Price_^FTSE、Date_^GSPC、Price_^GSPC的结构。
解决方案
核心思路是先拆分每个标的的数据集,为列名添加标的前缀后,再按列绑定所有数据集,自动用NA填充缺失的观测值。
完整代码
library(yfR) library(tidyverse) # 1. 下载原始数据 Symbols <- c("^GSPC", "^FTSE") StartDate <- "2010-01-01" EndDate <- "2019-12-31" RawData <- yf_get(Symbols, first_date = StartDate, last_date = EndDate, freq_data = "daily", do_complete_data = TRUE) # 2. 筛选并重命名所需列 Returns <- RawData %>% select(ref_date, price_adjusted, ticker) %>% rename(Date = ref_date, Price = price_adjusted, Ticker = ticker) # 3. 拆分数据并添加列名前缀,最后绑定 final_df <- Returns %>% # 按标的拆分数据,仅保留Date和Price列 group_split(Ticker, .keep = FALSE) %>% # 给每个拆分后的数据集命名为对应的标的代码 set_names(unique(Returns$Ticker)) %>% # 为每个数据集的列添加标的前缀 map2(.x = ., .y = names(.), ~ rename_with(.x, ~paste0(.x, "_", .y))) %>% # 按列绑定所有数据集,缺失值自动填充NA bind_cols()
代码解释
group_split(Ticker, .keep = FALSE):将数据按标的拆分为多个独立的数据框,每个数据框仅保留Date和Price列。set_names(unique(Returns$Ticker)):给拆分后的每个数据框命名为对应的标的代码,方便后续添加列名前缀。map2(...):遍历每个数据框和对应的标的名称,用rename_with给列名添加标的前缀(如Date变为Date_^FTSE)。bind_cols():将所有带前缀的数据框按列合并,行数取观测最多的标的的行数,缺失的观测值自动填充NA。
最终结果结构
运行后final_df的结构示例:
str(final_df) tibble [2524 × 4] (S3: tbl_df/tbl/data.frame) $ Date_^FTSE : Date[1:2524], format: "2010-01-04" "2010-01-05" ... $ Price_^FTSE: num [1:2524] 5500 5522 5530 5527 ... $ Date_^GSPC : Date[1:2524], format: "2010-01-04" "2010-01-05" ... NA NA ... $ Price_^GSPC: num [1:2524] 1133 1137 1137 1142 ... NA NA ...
内容的提问来源于stack exchange,提问作者Hans Larsen
相关产品推荐
相关产品推荐

