【发布时间】:2018-05-20 07:47:29
【问题描述】:
所以我有 1300 个财务数据的 csv 文件,格式如下:
Date Open High Low Close
1 Nov 28, 2017 0.233394 0.234871 0.223832 0.225542
2 Nov 27, 2017 0.225910 0.234219 0.212298 0.233113
3 Nov 26, 2017 0.229367 0.235126 0.215153 0.226367
4 Nov 25, 2017 0.234212 0.239257 0.223383 0.228617
5 Nov 24, 2017 0.215836 0.236280 0.209834 0.234195
6 Nov 23, 2017 0.228887 0.232974 0.214334 0.216585
我的目标是从每个文件中提取“打开”列并将这些列绑定在一起,使其看起来像这样:
Date "File1" "File2" "File3" ... "File 1300"
1 Nov 28, 2017 0.233394 0.234871 0.223832 ... 0.225542
2 Nov 27, 2017 0.225910 0.234219 0.212298 ... 0.233117
3 Nov 26, 2017 0.229367 0.235126 0.215153 ... 0.226367
4 Nov 25, 2017 0.234212 NA 0.223383 ... 0.228617
5 Nov 24, 2017 0.215836 NA 0.209834 ... 0.234195
6 Nov 23, 2017 0.228887 NA 0.214334 ... NA
我知道这里已经有很多关于如何从多个 csv 文件中提取列以及如何将它们绑定在一起的问题,我快到了,但问题是文件的长度不同我有基于日期的观察。例如,一个文件可以有 2014 年 11 月 3 日的观测值,而另一个文件可以有 2017 年 11 月 23 日的观测值。否则,文件的格式相同,它们的最后观测值都是 2017 年 11 月 28 日。
到目前为止,您可以在下面看到我的代码
# Get a List of all files in directory
filenames <- list.files(".../path, pattern="*.csv", full.names=F)
# Loading column "Open" from each file
for(i in filenames){
filepath <- file.path(".../path", paste(i,sep=""))
assign(i, read.csv(filepath, header=T, sep = ";",
colClasses=c(NA, NA, "NULL", "NULL", "NULL")))
}
#making a list of all data frames
df_list <- lapply(ls(), function(x) if (class(get(x)) == "data.frame") get(x))
#merging
library(dplyr)
res2 <- Reduce(function(...) left_join(..., by=c("Date")), df_list)
如您所见,我将所有 csv 文件加载到全局环境中并将其添加到一个列表中,然后我想将列合并到一个数据框中。问题似乎是合并部分,Reduce 或 dplyr-package 似乎无法解决问题。
所以我的问题是,您是否有任何解决方案可以将所有日期列绑定在一个数据框中并按日期排序?而且,是否有任何快速解决方法可以将文件名作为列的标题?
我也不确定 R 是否是解决此问题的最佳方法。我对 Python 不是很熟悉,但如果您认为它更简单,我可以尝试使用它。
【问题讨论】: