我有一个参考股票代码表(20,000行)
和一个CSV文件文件夹,每个CSV文件由一个股票代码命名,例如ZTS.csv。在每个CSV文件中,是该符号的价格历史记录。
最终目标是跟踪所有股票和可视化的表现。由于参考表和CSV文件非常大,我认为最明智的方法是从每个CSV文件中选择需要的信息,并将它们添加到参考表中。
例如,我想从引用表中提取一行符号ZTS,showdate 2017-01-09,
然后读取ZTE.csv文件,找到日期与展示日期匹配的行,添加开盘/高点/低点/收盘价数据列
然后循环此命令。
由于大小限制,我已将样本数据上传到Google Drive: https://drive.google.com/drive/folders/1G3os67b2i2VfGHnvR6NX8qk1ECuVawGJ?usp=sharing
#read in the reference data
df <- read.csv("reference table.csv", header = TRUE)
# get csv files directory and list all files in this directory
wd <- "/Users/m/Desktop/project/price_data_csv"
files_in_wd <- list.files(wd)
#find stuff to match
# create an empty list and read in all files from wd
mylist <- list()
for(i in seq_along(files_in_wd)){
mylist[[i]] <- read.delim(file = files_in_wd[i],
sep = ',',
header = T)
}
我纠结于如何匹配和创建组合表。谢谢您
我推荐使用data.table
,因为正如@r2evans提到的那样,它可以很好地进行分组,如果您的数据量很大,它会非常快。
使用您的样例数据,您应该可以开始使用这个方法(我已经为data.table
方法添加了前缀,以帮助指明它的使用位置)。您可以对单个符号使用提供的函数,或尝试一次运行所有符号(不确定您的数据实际有多大)。
library(data.table)
data_dir <- "~/Downloads/Testing/"
reference_table <- data.table::fread(paste0(data_dir, "reference table.csv"));
prepare_symbol_table <- function(sym, ref) {
# This check is only necessary if calling individually
if(data.table::uniqueN(ref$symbol) > 1)
ref <- ref[symbol == sym]
symbol_csv <- data.table::fread(paste0(data_dir, sym, ".csv"))
data.table::merge.data.table(ref, symbol_csv, by.x = c("showdate"), by.y = c("date"))
}
# merge a single symbol table
yum_table <- prepare_symbol_table("YUM", reference_table)
# all merged at once, reading individual CSVs by matching the symbol column from
# the reference table
all_symbols_merged <- reference_table[, {
# symbol_csv <- data.table::fread(paste0(data_dir, symbol, ".csv"))
# data.table::merge.data.table(.SD, symbol_csv, by.x = c("showdate"), by.y = c("date"))
prepare_symbol_table(.BY, .SD)
}, by = c("symbol")]