簡體   English   中英

如何提取信息並在R中的多個相似文件上執行相同操作?

[英]How to extract information and perform the same operation on multiple similar files in R?

我有幾百個文件,每個文件代表特定股票的價格,我想遍歷它們,計算對數收益,並將對數收益作為列添加到包含所有股票對數收益的數據框中。

本質上,我有類似這樣的內容,比如說我有三個分別名為“ a.csv”,“ b.csv”和“ c.csv”的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

前言:不要使用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更有意義。

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)))

將文件放在一個名為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_csvreadr包,它會比快read.csv ,並提供一個進度條。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM