簡體   English   中英

在 R 中的多個文件上應用相同的函數

[英]applying same function on multiple files in R

我是 R 程序的新手,目前正在研究一組財務數據。 現在我的工作目錄下有大約 10 個 csv 文件,我想分析其中一個並將相同的命令應用於其余的 csv 文件。

以下是這些文件的所有名稱:(“US%10y.csv”、“UK%10y.csv”、“GER%10y.csv”、“JAP%10y.csv”、“CHI%10y.csv”、 "SWI%10y.csv"、"SOA%10y.csv"、"BRA%10y.csv"、"CAN%10y.csv"、"AUS%10y.csv")

例如,因為 CSV 文件中的 Date 列是 Factor 所以我需要將它們更改為 Date 格式:

CAN <- read.csv("CAN%10y.csv", header = T, sep = ",")
CAN$Date <- as.character(CAN$Date)
CAN$Date <- as.Date(CAN$Date, format ="%m/%d/%y")
CAN_merge <- merge(all.dates.frame, CAN, all = T)
CAN_merge$Bid.Yield.To.Maturity <- NULL

all.dates.frame 是連續 731 天的數據框。 我想合並它們,以便每個文件都具有相同的行數,這使我以后可以將 10 個文件組合在一起以獲得 731 X 11 的主數據框。

我當然可以復制並粘貼此代碼並更改文件名,但是有沒有簡單的方法可以使用 apply 或 for 循環來做到這一點???

非常感謝您的幫助。

這應該可以解決問題。 如果某個部分不起作用,請發表評論。 沒有測試就寫了這個盲文。

獲取當前目錄中以.csv結尾的文件列表

L = list.files(".", ".csv")

循環遍歷每個名​​稱並讀取每個文件,執行您想要執行的操作,返回 data.frame DF_Merge並將它們存儲在列表中。

O = lapply(L, function(x) {
           DF <- read.csv(x, header = T, sep = ",")
           DF$Date <- as.character(CAN$Date)
           DF$Date <- as.Date(CAN$Date, format ="%m/%d/%y")
           DF_Merge <- merge(all.dates.frame, CAN, all = T)
           DF_Merge$Bid.Yield.To.Maturity <- NULL
           return(DF_Merge)})

將所有的DF_Merge data.frames 綁定到一個 big data.frames

do.call(rbind, O)

我猜你需要某種指標,所以這可能很有用。 根據文件名rep(substring(L, 1, 3), each = 731)的前 3 個字符創建一個指標列

一個dplyr解決方案(雖然未經測試,因為沒有給出可重復的例子):

library(dplyr)

file_list <- c("US%10y.csv", "UK%10y.csv", "GER%10y.csv","JAP%10y.csv", "CHI%10y.csv", "SWI%10y.csv","SOA%10y.csv", "BRA%10y.csv", "CAN%10y.csv", "AUS%10y.csv")

can_l <- lapply(
  file_list
  , read.csv
)

can_l <- lapply(
  can_l
  , function(df) {
    df %>% mutate(Date = as.Date(as.character(Date), format ="%m/%d/%y"))
  }
)

# Rows do need to match when column-binding
can_merge <- left_join(
  all.dates.frame
  , bind_cols(can_l)
)

can_merge <- can_merge %>% 
  select(-Bid.Yield.To.Maturity)

一種可能的解決方案是以列表的形式將所有文件讀入 R,然后使用lapply to 將函數應用於所有數據文件。 例如:

# Create vector of file names in working direcotry
files <- list.files() 
files <- files[grep("csv", files)]  

#create empty list
lst <- vector("list", length(files))

#Read files in to list
for(i in 1:length(files)) {
    lst[[i]] <- read.csv(files[i])
}

#Apply a function to the list
l <- lapply(lst, function(x) {
    x$Date <- as.Date(as.character(x$Date), format = "%m/%d/%y")
return(x)
}) 

希望它有幫助。

暫無
暫無

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

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