You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:19:50