R:如何循环读取CSV文件并通过匹配R中引用数据表中的行来提取每个文件中的信息 [英] R: how to loop read csv files and extract information within each file by matching rows in a reference datatable in R

查看:0
本文介绍了R:如何循环读取CSV文件并通过匹配R中引用数据表中的行来提取每个文件中的信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个参考股票代码表(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")]

这篇关于R:如何循环读取CSV文件并通过匹配R中引用数据表中的行来提取每个文件中的信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆