如何在R中的多个类似文件中提取信息并执行相同的操作?

时间:2018-02-04 06:50:52

标签: r for-loop multiple-files

我有几百个文件,每个文件代表特定股票的价格,我想循环遍历它们,计算日志返回,并将日志返回添加为包含所有日志返回的数据框中的列股票。

基本上,我有类似的东西,比如我有三个名为" a.csv"," b.csv"和" c.csv",它们看起来像(下面的数字是完全捏造的,这个想法只是日期不一定相同,文件长度也不一样,但它们有相同的列和名称):

a.csv:

Date    Adj.Close
1/1/2001    5
1/2/2001    5.25
1/3/2001    5.17
1/4/2001    5.09
1/5/2001    5.83

b.csv:

Date    Adj.Close
3/17/2005   17.85
3/18/2005   19.20
3/19/2005   18.55
3/20/2005   18.45

c.csv:

Date    Adj.Close
5/9/1995    25.39
5/10/1995   25
5/11/1995   25.83
5/12/1995   24.99
5/13/1995   28
5/16/1995   27.17
5/17/1995   26.95

我知道如何计算一个文件的日志返回值(以下内容适用于一个文件):

setwd('my_wd')
data <- read.csv('a.csv')
attach(data) 
n = dim(data)[1] 
log_rtn = diff(log(Adj.Close)) 

这给了我第一个csv的日志返回列表。我想做的(伪代码)是:

for file in my_wd:
 data <- file_name.csv
 attach(data) 
 n = dim(data)[1] 
 file_name_log_rtn = diff(log(Adj.Close)) 

为了返回同名的日志返回列表,如csv(伪输出),类似(以文件命名,如下所示):

a_log_rtn:

0.048790164, -0.015355388,-0.015594858,0.13573917

b_log_rtn:

0.072906771, -0.03444049,-0.005405419

c_log_rtn:

-0.015479571,0.032660782,-0.033060862,0.113728765,-0.030091087,-0.008130126

3 个答案:

答案 0 :(得分:3)

前言:请勿使用attach,您无法从中获益,并且可能会造成伤害。

无法访问您的文件我没有测试下面的代码,但我会按照它的方式做一些事情 诀窍是使用lapply来处理循环中的所有文件。我使用它两次,一次读取数据,第二次使用日志返回创建一个新列。

olddir <- setwd('my_wd')

files_list <- list.files(pattern = "*\\.csv")
data_list <- lapply(files_list, read.csv)
data_list <- lapply(data_list, function(DF){
            DF[["log_rtn"]] <- c(NA, diff(log(DF[["Adj.Close"]])))
            DF
        })

# reset the old directory if you want
#setwd(olddir)

请注意,列log_rtn将以NA作为第一个值。如果您愿意,可以将其更改为0,但我相信NA更有意义。

答案 1 :(得分:2)

allfiles=list.files(path_to_the_files_here,pattern = "\\.csv")
listdata=lapply(allfiles,function(x)transform(read.csv(x),log_Adj.Close=log(Adj.Close)))

如果您愿意,可以将这些列表列入环境:

list2env(setNames(listdata,gsub(".*(.)(\\.csv)","\\1",allfiles)))

答案 2 :(得分:1)

将文件放在目录中,比如称为csv_dir

csv_list <- list.files(csv_dir, pattern = "csv", full.names = T)
names(csv_list) <- basename(csv_list)
log_diffs <- lapply(csv_list, function(t) {tcsv <- read.csv(t)
                                           diff(log(tcsv$Adj.Close)
                                            })

这将生成一个包含所需内容的列表log_diffs。要查看特定文件的结果,您可以使用log_diff[["a.csv"]]作为示例。如果要将所有结果放在一个大数据框中,其中一列用于文件名,另一列用于日志差异,则可以执行以下操作:

log_diffs <- lapply(csv_list, function(t) {tcsv <- read.csv(t)
                                           data.frame(file = rep(basename(t)),
                                           log.diff = diff(log(tcsv$Adj.Close),
                                           stringsAsFactors = F)})

csv_log_diffs <- do.call(rbind(log_diffs))

如果您的csv文件非常大,您可以考虑使用read_csv包中的readr,它会比read.csv更快,并提供进度条。